在Matlab中构造一个元素正好是它们的索引的矩阵的最佳方法是什么?
编辑:这个问题的现有答案适用于如何构建一个矩阵,其元素是其索引的函数.所以我把它添加到问题标题中.
格式可以是以矢量为元素的矩阵,也可以是每个存储一个索引的两个矩阵.
最后,我想创建一个矩阵,其元素是其索引的函数.因此非常感谢一种有效的方法(但可能不同).对效率的任何评论都受到欢迎.
对于我的应用程序,矩阵的大小往往很大(最小数百平方).因此,利用原生Matlab函数的方法可能比for/while循环要好得多.
例如,对于大小为[2 2]的矩阵,我想制作其中一个
IND =
[1 1] [1 2]
[2 1] [2 2]
Run Code Online (Sandbox Code Playgroud)
要么
X =
1 1
2 2
Y =
1 2
1 2
Run Code Online (Sandbox Code Playgroud)
最后,我希望做类似的事情
matrixIneed = arrayfun(@(s)..., IND)
Run Code Online (Sandbox Code Playgroud)
其中s是大小为2的向量,或
matrixIneed = arrayfun(@(i,j)..., X,Y)
Run Code Online (Sandbox Code Playgroud)
后者是优选的.
编辑:关于已接受答案的说明.
我已经接受了安德鲁的回答,因为它对我来说很直观,代码似乎很快(至少对我来说).
如果你曾经谷歌这个问题的答案,你可能会像我一样关注性能.(否则,如果不是最佳实践,任何人都可以想到双循环来完成任务.)
如果是这样,建议您检查对安德鲁的评论reshape()功能,罗迪的有关性能的答案meshgrid()和loops.
尽管如此,thewaywewalk的解决方案meshgrid()是学习该meshgrid()功能的有用示例.它在许多其他Matlab函数中很有用.
Jigg的repmat()解决方案也可以为您提供帮助.
使用meshgrid或ndgrid:
% example matrix
Matrix = magic(5)
[n m] = size(Matrix)
% or define the dimensions directly
n = 5;
m = 5;
[X,Y] = meshgrid(1:n,1:m) %\\ [Y,X] = ndgrid(1:n,1:m)
Run Code Online (Sandbox Code Playgroud)
(2D情况的区别在于,Y并且X是交换的. - 根据您的需要使用它.)
从文档:
[X,Y] = meshgrid(xgv,ygv)复制网格矢量xgv并ygv生成完整的网格.此网格由输出坐标数组表示X和Y.输出坐标阵列X和Y包含网格向量的副本xgv和ygv分别.输出数组的大小由网格矢量的长度决定.电网矢量xgv和ygv长度的M和N分别X与Y将具有N的行和M列.
那么没有太多要解释的,meshgrid用于从两个向量创建规则网格,通常是" x"和" y"值,以便获得用于z-data 的3D /颜色编码图的合适输入数据.如果你假设你的x并且y是矢量[1 2 3 ... n]它完全符合你的需要.
收益:
X =
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Y =
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
Run Code Online (Sandbox Code Playgroud)
看一下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);
Run Code Online (Sandbox Code Playgroud)
@thewaywewalk 给出的方法meshgrid将产生相同的输出,但我认为ind2sub在这种情况下该方法更具可读性,因为它是按照数组索引来措辞的,这是您的问题域。它将泛化到处理切片或数组的任意子集,而这meshgrid不会,并且很好地对应于ind2sub其他方式的高效操作。meshgrid(无论如何,它还是值得学习的;它会在其他地方出现。)