【问题标题】:How can we use nchoosek() to get all the combinations of the rows of a matrix?我们如何使用 nchoosek() 来获取矩阵行的所有组合?
【发布时间】:2017-11-09 14:24:05
【问题描述】:

如果我们有一个包含 1-5 个数字的向量 v,我们可以使用 nchoosek(v,2) 来获得所有包含两个元素的组合。但是这个函数现在允许我们得到一个矩阵的所有组合。我想用它来获取矩阵行的所有组合。

【问题讨论】:

  • 你的意思是你想得到由第 1&2 行、第 1&3、3&5 行等组成的新的 2 行矩阵,以及从 nchoosek 获得的行组合?
  • 这正是我所需要的......实际上我需要在该矩阵的每个可能的行组合上调用 knnClassify() 函数,所以我将需要所有具有所需行的矩阵......

标签: matlab combinations


【解决方案1】:

这是一种方法:

function p = q47204269(inMat)
% Input handling:
if nargin == 0 || isempty(inMat)
  inMat = magic(5);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rowsCell = num2cell(inMat,2);
nRows = size(inMat,1);
p = cell(nRows,1);
for indR = 1:nRows
  r = nchoosek(1:nRows,indR);
  p{indR} = cell2mat(reshape(rowsCell(r.',:).',indR,1,[]));
end  

另见:

  • perms 函数,因为它可能会在您正在做的事情中派上用场。
  • This question.

【讨论】:

  • 这里的 n 是什么?我想每次选择 n 行。我的意思是首先只有 1 行然后 2 行而不是 3 行而不是 n 行的所有组合...
  • @AliHassan 我已更新答案以使其更清晰。
【解决方案2】:

带方阵A

v = 1:size(A,1);
a = nchoosek(v,2);
B = zeros(2,size(A,1),length(a));
for i = 1:length(a)
    B(:,:,i) = A(a(i,:)',:);
end

数组B 的每一层都是一个 2 行矩阵,其中包含来自 A 的行组合

【讨论】:

  • 请不要提倡循环增长矩阵等不良做法。
  • 糟糕,我正在测试它是否可以在与我打开的机器不同的机器上运行,并且在我转移时完全忘记重新输入预分配。现在将修复。
  • 如果速度很关键或者矩阵大小与可用内存相比很重要,那么循环增长矩阵只是一种不好的做法。通常不是。
【解决方案3】:

不是最易读的答案,但只是为了单线:-)

A = randn(5,3); % example matrix
N = 2; % number of rows to pick each time
result = permute(reshape(A(nchoosek(1:size(A,1), N).', :), N, [], size(A,2)), [1 3 2]);

结果是一个 3D 数组,这样每个第三维切片都会给出 A 的 a 子矩阵之一。

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多