matlab - 基于每行的列索引折叠矩阵每一行的有效方法

标签 matlab matrix

我想通过根据为每行指定的列索引执行操作来按行减少矩阵中的列数。给出以下示例数据:

M = magic(4);
col_ind = [1; 3; 2; 4];

我想制作一个三列矩阵,第一列包含每行到指定列索引的行总和,第二列包含该行中 M 的值,由列索引指定,最后一列包含该行中其余条目的行总和,即生成矩阵 M_out:

M_out = nan(4,3);
for i = 1:4
    M_out(i, :) = [sum(M(i, 1:col_ind(i)-1), 2), ...
        M(i, col_ind(i)), sum(M(i, col_ind(i)+1:end), 2)];

end

这样:

>> M_out

M_out =

     0    16    18
    16    10     8
     9     7    18
    33     1     0

最佳答案

根据Stewie's comment ,我将在这里使用 tril 来完成此操作。第二列很简单,使用 sub2ind 。那么第三列就变得微不足道了:

T = tril(ones(size(M, 2)), -1);
M_out = zeros(size(M, 1), 3);
M_out(:, 1) = sum(T(col_ind,:) .* M, 2);
M_out(:, 2) = M(sub2ind(size(M), (1:size(M, 1)).', col_ind));
M_out(:, 3) = sum(M, 2) - sum(M_out, 2);

或者,使用 cumsum 会更高效一些:

cs = cumsum(M, 2);
M_out = zeros(size(M, 1), 3);
M_out(:, 2) = M(sub2ind(size(M), (1:size(M, 1)).', col_ind));
M_out(:, 1) = cs(sub2ind(size(cs), (1:size(cs, 1)).', col_ind)) - M_out(:, 2);
M_out(:, 3) = cs(:, end) - sum(M_out, 2);

关于matlab - 基于每行的列索引折叠矩阵每一行的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40123762/

相关文章:

matlab - 使用Matlab对声音进行反卷积

r - do.call 和 order 将每一行按矩阵的降序排序?

r - 从函数值有效地创建矩阵

r - 使用回收创建矩阵

matlab - 如何在 MATLAB 中为多个属性编写通用设置方法

matlab - 如何检测文本编辑对象的焦点丢失?

algorithm - 神经网络 - 求解具有时间数组和不同采样率的网络

matlab - 在表格 [a b; 上打印矩阵光盘; ...]

c# - 如何用 Ilnumerics 矩阵计算克罗内克和?

c++ - 使用 SSE 计算矩阵乘积比使用直接算法慢得多