我是一名有用的助手,可以为您翻译文本。
我在考虑使用sub2ind,但这也需要将其变量用逗号分隔...
@gnovice 这个方法可以实现,但我打算经常从矩阵M中提取这种元素。所以如果每次访问M都要创建一个临时变量cellJ,这会不会极大地减慢计算速度?
我也可以编写一个单独的函数。
请注意,这是关于算法不同配置的速度与灵活性考虑的问题。当然,这只适用于获取元素,对于设置元素来说,除了实际使用索引(最好是线性索引)之外,没有其他方法。我仍然认为sub2ind是一个选项。我最终想要的结果是这样的:
我有一个非固定维度的矩阵M,我想要访问单个元素。
这个元素的索引包含在向量J中。
例如:
M = rand(6,4,8,2);
J = [5 2 7 1];
output = M(5,2,7,1)
这一次M有4个维度,但事先并不知道。这取决于我正在编写的算法设置。同样也可能是
M = rand(6,4);
J = [3 1];
output = M(3,1)
所以我不能简单地使用
output=M(J(1),J(2))
我在考虑使用sub2ind,但这也需要将其变量用逗号分隔...
@gnovice 这个方法可以实现,但我打算经常从矩阵M中提取这种元素。所以如果每次访问M都要创建一个临时变量cellJ,这会不会极大地减慢计算速度?
我也可以编写一个单独的函数。
function x= getM(M,J)
x=M(J(1),J(2));
% M doesn't change in this function, so no mem copy needed = passed by reference
end
请注意,这是关于算法不同配置的速度与灵活性考虑的问题。当然,这只适用于获取元素,对于设置元素来说,除了实际使用索引(最好是线性索引)之外,没有其他方法。我仍然认为sub2ind是一个选项。我最终想要的结果是这样的:
function idx = getLinearIdx(J, size_M)
idx = ...
end
结果:
function lin_idx = Lidx_ml( J, M )%#eml
%LIDX_ML converts an array of indices J for a multidimensional array M to
%linear indices, directly useable on M
%
% INPUT
% J NxP matrix containing P sets of N indices
% M A example matrix, with same size as on which the indices in J
% will be applicable.
%
% OUTPUT
% lin_idx Px1 array of linear indices
%
% method 1
%lin_idx = zeros(size(J,2),1);
%for ii = 1:size(J,2)
% cellJ = num2cell(J(:,ii));
% lin_idx(ii) = sub2ind(size(M),cellJ{:});
%end
% method 2
sizeM = size(M);
J(2:end,:) = J(2:end,:)-1;
lin_idx = cumprod([1 sizeM(1:end-1)])*J;
end
方法2比方法1快20到80倍(对于需要转换的索引集数量较少(=P
)的情况下,速度提升更为明显)。很容易做出选择。