![]() |
优化从MATLAB矩阵提取数据?
给定一个n维值矩阵:通过任意索引(即坐标)检索值的最有效方法是什么?
例如,在随机5x5矩阵中,如果我想要(1,1)(2,3)和(4,5)处的值,最简单的仅返回这些坐标值的方法是什么? 例如,如果我在单独的矩阵中提供这些坐标,那么是否只有一行[URL="http://en.wikipedia.org/wiki/MATLAB"]MATLAB[/URL]可以完成这项工作?就像是: x=rand(5,5); y=[[1,1];[2,3];[4,5]]; z=x(y); 除非那行不通。 请注意,由于种种原因,我无法使用线性索引-必须使用原始索引返回结果。这些矩阵的大小可能非常大,因此我也不想使用循环。 回答: 如果您反对使用线性索引和循环,则唯一的替代选择AFAIK是逻辑索引。但是,如果y始终采用您建议的形式,则需要根据y指定的索引创建逻辑矩阵。 您能解释为什么不允许线性索引吗? 无论如何,如果您想要一个真正愚蠢的答案(这就是我所能提供的全部信息): z = diag(x(y(:,1),y(:,2))) 当然,这将不必要地创建一个巨大的矩阵并从中提取对角线元素(您需要的对角元素),但是它可以将其完成一行,等等。 [B]编辑:[/B]如果限制是对原始数据使用线性索引,那么您可以使用线性索引创建逻辑矩阵并以此索引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); 另外,逻辑索引应该比线性索引快,因此除了构建蒙版之外,您的状态还不错。 [url=https://stackoverflow.com/questions/1680557]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 20:17。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.