【问题标题】:Octave or Matlab code for iterative selection of the columns of a matrix用于迭代选择矩阵列的 Octave 或 Matlab 代码
【发布时间】:2021-12-20 19:59:51
【问题描述】:

我有一个矩阵A 由4 列C1C2C3C4 组成。 我想拥有可以从矩阵 A 生成的所有矩阵(向量),而无需重复列并且列的顺序无关紧要,即矩阵 B = [C1 C2] = [C2 C1] 。更准确地说,我想获得以下矩阵/向量:[C1]; [C2]; [C3]; [C4]; [C1 C2]; [C1 C3]; [C1 C4]; [C2 C3]; [C2 C4 ]; [C3 C4]; [C1 C2 C3]; [C1 C2 C4]; [C1 C3 C4]; [C2 C3 C4]; [C1 C2 C3 C4]

我怎样才能在八度音阶中做到这一点?

【问题讨论】:

  • 您是否需要一个循环来顺序提供这些矩阵?或者构建一个包含所有这些的单元格数组?矩阵必须按照您的示例中的顺序生成,还是可以接受任何顺序?
  • 在您明确询问 Octave 代码的问题正文中,但标题和标签表明您也可以接受 MATLAB 代码。这两个是不一样的。可以编写同时适用于两者的代码,但一般来说,为一个编写的代码不会在没有更改的情况下在另一个运行。

标签: arrays matrix octave


【解决方案1】:

这是使用逻辑索引和 arrayfun 执行此操作的 MATLAB 代码:

n = size(A,2); % number of columns
x = logical(dec2bin(1:2^n-1)-'0'); % logical array of all possible combinations
C = arrayfun(@(k)A(:,x(k,:)),1:size(x,1),'uni',false); % build the combinations

结果将在元胞数组 C 中。基本上,dec2bin 结果的每一行都用于对 A 的列进行逻辑索引。请注意,此方法仅适用于相对较小的 n 值。对于较大的 n,内存需求很快就会变得不堪重负。

【讨论】:

  • 也许使用x = dec2bin(1:2^n-1)~='0'; 更易读,或者更好的是x = dec2bin(1:2^n-1)=='1';
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多