构造矩阵恰好是其在Matlab中的索引的矩阵的最佳方法是什么?
编辑:这个问题的现有答案适用于如何构建一个矩阵,其元素是其索引的函数。所以我将其添加到问题标题中。
格式可以是将向量作为元素的矩阵,也可以是两个分别存储一个索引的矩阵。
最后,我想创建一个矩阵,其元素是其索引的函数。因此,非常感谢一种有效的方法(但可能有所不同)。欢迎对效率发表任何评论。
对于我的应用程序,矩阵的大小往往会很大(最小尺寸为数百平方)。结果,利用本机Matlab函数的方法可能比for / while循环要好得多。
例如,对于大小为[2 2]的矩阵,我想选择
IND =
[1 1] [1 2]
[2 1] [2 2]
或者
X =
1 1
2 2
Y =
1 2
1 2
最后,我希望做些类似的事情
matrixIneed = arrayfun(@(s)..., IND)
其中s是大小为2的向量,或者
matrixIneed = arrayfun(@(i,j)..., X,Y)
后者是优选的。
编辑:关于接受的答案的说明。
我接受了安德鲁的回答,因为它对我来说很直观,并且代码看起来很快捷(至少对我而言)。
如果您曾经向Google提出过此问题的答案,那么您可能会像我一样担心性能。(否则,如果不是最佳实践,则任何人都可以想到双重循环来完成任务。)
如果是这样,我们鼓励您检查Andrew对reshape()
函数的评论以及Rody关于meshgrid()
and的性能的答案loops
。
尽管如此,waywaywalk的解决方案仍meshgrid()
是学习该meshgrid()
功能的有用示例。它在许多其他Matlab函数中很有用。
Jigg的repmat()
解决方案也可以为您提供帮助。
看一看的ind2sub
,sub2ind
和reshape
功能。它们对于转换多维数组上的下标和索引很有用。
在您的情况下,看起来像您想要的。(我认为您希望使用“下标”而不是“索引”。当将数组视为一维矢量时,Matlab使用“索引”表示元素的“线性”索引,而使用“下标”表示沿每个元素的位置多维数组的维度。)
sz = [3 3]; % Size of your matrix
n = prod(sz); % Total number of elements in matrix
[X, Y] = ind2sub(sz, 1:n); % Subscripts, returned as vectors
X = reshape(X, sz); % Reshape the subscript vectors to match your matrix
Y = reshape(Y, sz);
meshgrid
@thewaywewalk提供的方法将产生相同的输出,但是我认为ind2sub
这种情况下该方法更具可读性,因为它是根据数组索引(这是您的问题领域)来措辞的。而且它将泛化到对切片或数组的任意子集进行处理,meshgrid
而不会这样做,并且恰好对应ind2sub
于高效操作的另一种方式。(meshgrid
尽管如此,还是值得学习的;它会在其他位置弹出。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句