给定一个n维值矩阵:通过任意索引(即坐标)检索值的最有效方法是什么?
例如,在随机5x5矩阵中,如果我想要(1,1)(2,3)和(4,5)处的值,最简单的仅返回这些坐标值的方法是什么?
例如,如果我在单独的矩阵中提供这些坐标,那么是否只有一行
MATLAB可以完成这项工作?就像是:
x=rand(5,5); y=[[1,1];[2,3];[4,5]]; z=x(y); 除非那行不通。
请注意,由于种种原因,我无法使用线性索引-必须使用原始索引返回结果。这些矩阵的大小可能非常大,因此我也不想使用循环。
回答:
如果您反对使用线性索引和循环,则唯一的替代选择AFAIK是逻辑索引。但是,如果y始终采用您建议的形式,则需要根据y指定的索引创建逻辑矩阵。
您能解释为什么不允许线性索引吗?
无论如何,如果您想要一个真正愚蠢的答案(这就是我所能提供的全部信息):
z = diag(x(y(:,1),y(:,2)))
当然,这将不必要地创建一个巨大的矩阵并从中提取对角线元素(您需要的对角元素),但是它可以将其完成一行,等等。
编辑:如果限制是对原始数据使用线性索引,那么您可以使用线性索引创建逻辑矩阵并以此索引x 。例如
% Each element of L is only one byte L = false(size(x)); % Create the logical mask L(sub2ind(size(x),y(:,1),y(:,2))) = true; % Extract the required elements z = x(L); 同样,对于3维矩阵:
x = rand(3,3,3); y = [1 1 1;2 2 2;3 3 3]; L = false(size(x)); L(sub2ind(size(x),y(:,1),y(:,2),y(:,3))) = true; z = x(L); 另外,逻辑索引应该比线性索引快,因此除了构建蒙版之外,您的状态还不错。
更多&回答...