我是MATLAB的新手,但我已经拖了文档,找不到我想要的答案。

我已经在矩阵上完成了许多计算,最终得到了索引列表和应该在这些索引中列出的值列表。

例如:

Data =

         0         0         0         0         0         0
    3.7417    3.7417    3.7417    7.0711    3.3166    3.3166
    4.2426    4.2426    3.7417    7.0711    5.3852    7.0711
    7.0711    6.0828    5.3852    7.4833    6.0828    7.6158
    7.1414    7.4833    7.8740    8.7750    7.1414    7.8740

Indices =

     1     2     3     4     5     6
     3     3     1     1     6     5
     2     1     2     6     3     4
     4     5     5     2     2     2
     5     4     6     5     1     3

我想做的是构建一个方形矩阵(根据索引矩阵中发现的最大估值索引的大小n),这样的第一列 Indices 用于索引 Result 矩阵,以及 Data 放在 Result 所有位置的矩阵未索引数据集为0。

IE带有来自上方的数据和索引矩阵,我希望最终矩阵看起来像:

Result =
          0   4.2426    3.7417    7.0711    7.1414         0
     4.2426        0    3.7417    7.4833    6.0828         0
     3.7417   3.7417         0         0    5.3852    7.8740 
     7.0711   7.4833         0         0    8.7750    7.0711
     7.1414   6.0828    5.3852         0         0    3.3166
          0   7.6158    7.8740    7.0711    3.3166         0

(就像我手工做的那样,上面的错误可能会犯一些错误,但它应该对我想做什么提供一个想法)

MATLAB是否有一种简单的方法可以做到这一点?许多功能返回索引,我希望有一种简单的方法可以使用这些索引更新/构造矩阵。

谢谢,

格雷格

有帮助吗?

解决方案

我知道如何做到这一点是通过根据您的数据和索引创建稀疏矩阵:

[M,N] = size(Indices); indmax = max(Indices(:));
Result = sparse(repmat(1:N,M,1),Indices,Data,indmax,indmax);

希望有人来,向我们展示一种更清洁的方法。

其他提示

您所描述的是这样完成的:

[II,JJ]=meshgrid(1:size(Data,2),1:size(Data,1));
Result = zeros(size(Data,2));
Result(sub2ind(size(Result),II(:),Indices(:))) = Data(:);

请注意 II 通过 meshgrid 陈述等同于 II=repmat(1:size(Data,2),size(Data,1),1);.

该解决方案,基于 bsxfun, ,似乎比@nispio和@chappjc的速度要快一点:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top