我是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的地方。
即。使用上面的数据和索引矩阵,我希望最终矩阵看起来像:
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中有一个快速简单的方法吗?许多函数返回索引,我希望有一种简单的方法来使用这些索引更新/构造矩阵。
谢谢,
格雷格
答案 0 :(得分:3)
我知道如何做到最简洁的方法是根据您的数据和索引创建一个稀疏矩阵:
[M,N] = size(Indices); indmax = max(Indices(:));
Result = sparse(repmat(1:N,M,1),Indices,Data,indmax,indmax);
希望有人出现并向我们展示一种更清洁的方法。
答案 1 :(得分:3)
你所描述的是这样完成的:
[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);
。
答案 2 :(得分:2)
此解决方案基于bsxfun
,似乎比@nispio和@chappjc快一点:
S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;