我知道如何做到这一点是通过根据您的数据和索引创建稀疏矩阵:
[M,N] = size(Indices); indmax = max(Indices(:));
Result = sparse(repmat(1:N,M,1),Indices,Data,indmax,indmax);
希望有人来,向我们展示一种更清洁的方法。
题
我是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;