我有一个可以有多个维度的矩阵作为条目:n × m
or n × m × p
or or n × m × p × q
or ...
我想要做的是访问最后一个维度,例如:
data = input(:,:,1)
问题是数量:
可以改变。
我有一个可以有多个维度的矩阵作为条目:n × m
or n × m × p
or or n × m × p × q
or ...
我想要做的是访问最后一个维度,例如:
data = input(:,:,1)
问题是数量:
可以改变。
您应该利用这样一个事实,即数组中的索引可以是包含以下内容的字符串':'
:
>> data = rand(2, 2, 2, 5);
>> otherdims = repmat({':'},1,ndims(data)-1);
>> data(otherdims{:}, 1)
ans(:,:,1) =
7.819319665880019e-001 2.940663337586285e-001
1.006063223624215e-001 2.373730197055792e-001
ans(:,:,2) =
5.308722570279284e-001 4.053154198805913e-001
9.149873133941222e-002 1.048462471157565e-001
有关详细信息,请参阅文档subsref
。
这有点小技巧,但你可以这样做:
data = rand(2,2,3);
eval(['data(' repmat(':,',1,ndims(data)-1) '1)'])
这将给出(取决于随机数):
ans =
0.19255 0.56236
0.62524 0.90487
您可以使用shiftdim
将最后一个维度带到第一个维度并索引该维度并将其重新整形
x = rand(2,3,4,5,6);
sz = size(x);
A = shiftdim(x, numel(sz)-1);
B = reshape(A(1,:), sz(1:end-1));
和
>> isequal(B, x(:,:,:,:,1))
ans =
1
或者,您可以使用subsref
它来索引它:
B = subsref(x, substruct('()', [num2cell(repmat(':', 1, ndims(x)-1)) 1]))
好问题!
另一种可能性是在块中使用线性索引,然后重塑:
x = rand(2,3,4,5); % example data
n = 2; % we want x(:,:,...,:,n)
siz = size(x);
b = numel(x)/siz(end); % block size
result = reshape(x(b*(n-1)+1:b*n),siz(1:end-1));
这似乎是我电脑中最快的方法(但请自己尝试;这可能取决于 Matlab 版本和系统)
我认为这样做:
a = rand(2,2,2,3)
s = size(a)
r = reshape(a, [], s(end))
reshape(r(:,1), s(1:end-1)) %// reshape(r(:,2), s(1:end-1)) gives you a(:,:,:,...,2) etc...
我以丹尼斯的(正确)答案为基准,它给出了相同的结果,但不需要eval
,如果可能的话,总是值得避免的。
以防 GNU Octave 读者到达这里。
@Rody Oldenhuis 的答案可以用 Octave 写成单行:
> data = reshape(1:8, 2, 2, 2);
> data({':'}(ones(1,ndims(data)-1)){:}, 1)
ans =
1 3
2 4
这里:
{':'}(ones(1,ndims(data)-1)){:}
方法:
tmp = {':'};
tmp = tmp(ones(1,ndims(data)-1));
tmp{:}
当然,repmat({':'},1,ndims(data)-1){:}
也有效。