gpt4 book ai didi

performance - 在 matlab 中使用列零填充将向量 reshape 为矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:22 25 4
gpt4 key购买 nike

对于输入矩阵

in = [1 1;
1 2;
1 3;
1 4;
2 5;
2 6;
2 7;
3 8;
3 9;
3 10;
3 11];

我想得到输出矩阵

out = [1 5 8;
2 6 9;
3 7 10;
4 0 11];

意思是我想将第二个输入列 reshape 为输出矩阵,其中与第一个输入列中的一个值对应的所有值都写入输出矩阵的一列。

由于第一个输入列中的每个值可以有不同数量的条目(此处“1”和“3”有 4 个值,但“2”只有 3 个值),因此正常的 reshape 功能不适用。我需要将所有列填充到最大行数。

你知道如何做这个类似 matlab 的事情吗?

第二个输入列只能包含正数,所以填充值​​可以是0, -x, NaN, ...

我能想到的最好的是这个(基于循环):

maxNumElem = 0;
for i=in(1,1):in(end,1)
maxNumElem = max(maxNumElem,numel(find(in(:,1)==i)));
end

out = zeros(maxNumElem,in(end,1)-in(1,1));
for i=in(1,1):in(end,1)
tmp = in(in(:,1)==i,2);
out(1:length(tmp),i) = tmp;
end

最佳答案

以下任一方法都假设 incolumn 1 已排序,如示例所示。如果不是这种情况,请首先应用它根据该标准对 in 进行排序:

in = sortrows(in,1);

方法 1(使用 accumarray)

  1. 计算所需的行数,使用mode ;
  2. 使用accumarray收集与每一列对应的值,最后用零填充。结果是一个单元格;
  3. 水平连接所有单元格的内容。

代码:

[~, n] = mode(in(:,1));                                                 %//step 1
out = accumarray(in(:,1), in(:,2), [], @(x){[x; zeros(n-numel(x),1)]}); %//step 2
out = [out{:}]; %//step 3

或者,第 1 步可以用 histc 完成

n = max(histc(in(:,1), unique(in(:,1))));                               %//step 1

或使用accumarray:

n = max(accumarray(in(:,1), in(:,2), [], @(x) numel(x)));               %//step 1

方法 2(使用稀疏)

使用 this answer by @Dan 生成行索引向量, 然后用 sparse 建立你的矩阵:

a = arrayfun(@(x)(1:x), diff(find([1,diff(in(:,1).'),1])), 'uni', 0); %//'
out = full(sparse([a{:}], in(:,1), in(:,2)));

关于performance - 在 matlab 中使用列零填充将向量 reshape 为矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27946552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com