簡體   English   中英

3D矩陣:如何在MATLAB中將(行,列)對與3維通配符一起使用?

[英]3d matrix: how to use (row, column) pairs with 3rd dimension wildcard in MATLAB?

我有一個3維矩陣,以及(行,列)對的列表。 我想提取二維矩陣,該二維矩陣對應於那些位置的元素,並通過矩陣的深度進行投影。 例如,假設

>> a = rand(4, 3, 2)
a(:,:,1) =
    0.5234    0.7057    0.0282
    0.6173    0.2980    0.9041
    0.7337    0.9380    0.9639
    0.0591    0.8765    0.1693
a(:,:,2) =
    0.8803    0.2094    0.5841
    0.7151    0.9174    0.6203
    0.7914    0.7674    0.6194
    0.2009    0.2542    0.3600
>> rows = [1 4 2 1];
>> cols = [1 2 1 3];

我想得到的是

0.5234    0.8765    0.6173    0.0282
0.8803    0.2542    0.7151    0.5841

也許有一些尺寸的變化。 另外,盡管此示例在最后一個維度中使用通配符,但在某些情況下,我也使用了通配符。

我天真地嘗試a(rows, cols, :)並得到了一個3d矩陣,其中對角線就是我想要的。 我還發現sub2ind ,它將從a(:,:,1)平面中提取所需的元素。 我可以使用其中之一來實現所需的功能,但我想知道是否還有我遺漏的更規范,更優雅或更有效的方法?

更新

根據下面發布的答案,這就是我使用的解決方案,

sz = size(a);
subs = [repmat(rows, [1, sz(3)]);
     repmat(cols, [1, sz(3)]);
     repelem([1:sz(3)], length(rows))];
result = a(sub2ind(sz, subs(1,:), subs(2,:), subs(3,:)));

sub2ind幾乎是您在這里需要使用的將下標轉換為線性索引的方法(除了您自己手動計算線性索引之外)。 你可以做這樣的事情,這將在轉換以下rowscols的線性指標(在2D切片),然后它添加一個偏移量(等於一個二維切片元素的數量),以這些指標來樣元素第三維。

sz = size(a);
inds = sub2ind(sz(1:2), rows, cols);
inds = bsxfun(@plus, inds, (0:(sz(3)-1)).' * prod(sz(1:2)));
result = a(inds);

並自己實際計算線性指數

inds = (cols - 1) * sz(1) + rows;
inds = bsxfun(@plus, inds, (0:(sz(3) - 1)).' * prod(sz(1:2)));
result = a(inds);

另一種選擇是置換您的初始矩陣,以將第三維變為第一維,將其重塑為二維矩陣,然后將線性索引用作第二個下標

% Create a new temporary matrix
anew = reshape(permute(a, [3, 1, 2]), size(a, 3), []);

% Grab all rows (the 3rd dimension) and compute the columns to grab
result = anew(:, (cols - 1) * size(a, 1) + rows);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM