如何最好地构造一个矩阵,其元素正是它们在Matlab中索引的索引或函数?

Arg*_*yll 6 matlab matrix

在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()解决方案也可以为您提供帮助.

the*_*alk 7

使用meshgridndgrid:

% 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)复制网格矢量xgvygv生成完整的网格.此网格由输出坐标数组表示XY.输出坐标阵列XY包含网格向量的副本xgvygv分别.输出数组的大小由网格矢量的长度决定.电网矢量xgvygv长度的MN分别XY将具有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)


And*_*nke 3

看一下ind2subsub2ind、 和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(无论如何,它还是值得学习的;它会在其他地方出现。)