Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 从已有矩阵中提取矩阵_Matlab_Matrix - Fatal编程技术网

Matlab 从已有矩阵中提取矩阵

Matlab 从已有矩阵中提取矩阵,matlab,matrix,Matlab,Matrix,我已经编写了一个代码来生成一个包含四列的矩阵,以得到所有的数字组合,这些数字的总和等于9,每个数字的变化范围从0到9 m = zeros(220, 4); pd = 9; i = 1; for p = 0:1:pd for q = 0:1:pd-p for a = 0:1:pd-q-p m(i,:) = [p, q, a, pd-a-q-p]; i = i+1; end end end m 现在我要

我已经编写了一个代码来生成一个包含四列的矩阵,以得到所有的数字组合,这些数字的总和等于9,每个数字的变化范围从0到9

m = zeros(220, 4);
pd = 9;
i = 1;
for p = 0:1:pd
    for q = 0:1:pd-p
        for a = 0:1:pd-q-p
            m(i,:) = [p, q, a, pd-a-q-p];
            i = i+1;
        end
    end
end
m
现在我要过滤没有零,一个零,两个零,三个零的数组。喜欢 三零情况

0 0 0 9
0 0 1 8
0 0 2 7
.
.
0 0 8 1
0 1 1 7
0 1 2 6
.
.
.
0 7 1 1
1 1 1 6
1 1 2 5
.
.
6 1 1 1
二零情况

0 0 0 9
0 0 1 8
0 0 2 7
.
.
0 0 8 1
0 1 1 7
0 1 2 6
.
.
.
0 7 1 1
1 1 1 6
1 1 2 5
.
.
6 1 1 1
一零情况

0 0 0 9
0 0 1 8
0 0 2 7
.
.
0 0 8 1
0 1 1 7
0 1 2 6
.
.
.
0 7 1 1
1 1 1 6
1 1 2 5
.
.
6 1 1 1
没有零的情况

0 0 0 9
0 0 1 8
0 0 2 7
.
.
0 0 8 1
0 1 1 7
0 1 2 6
.
.
.
0 7 1 1
1 1 1 6
1 1 2 5
.
.
6 1 1 1
等等

有什么建议或其他方法吗?
更新:

0 0 0 9
0 0 1 8
0 0 2 7
    .
    .
0 0 8 1
0 1 1 7
0 1 2 6
    .
    .
    .
0 7 1 1
1 1 1 6
1 1 2 5
    .
    .
6 1 1 1

有没有建议按上述顺序获取矩阵
m

您可以使用以下函数获取矩阵
A
中具有
n
零的所有行:

function rows = nzrows(A, n)
  s = sum(A == 0, 2);
  rows = A(s == n, :);
end

这是我现在能做的最好的了,我还没有在你的整个输入矩阵上测试过它

m(sum(m == 0, 2) == N, :)
应返回包含
N
0s的
m

编辑:更新后,以下是完整代码的建议:

A = zeros(size(m));
k = 1;
for N = (size(m, 2) - 1):-1:0
    rows = (sum(m == 0, 2) == N);
    idx = k:k + sum(rows) - 1;
    A(idx, :) = m(rows, :);
    k = idx(end) + 1;
end
要按行中前导零的数量排序,只需
sortrows(m)


要按一行中零的总数进行排序,请使用。

这是我想到的:

zero_index =[];
one_index =[];
two_index =[];
three_index =[];

for i=1:size(m,1)
    if(sum(m(i,:)==0)==0)
        zero_index = [zero_index    i];
    end
    if(sum(m(i,:)==0)==1)
        one_index = [one_index  i];
    end
    if(sum(m(i,:)==0)==2)
        two_index=  [two_index i];
    end

    if(sum(m(i,:)==0)==3)
        three_index =   [three_index i];
    end

end

m(zero_index,:)
m(one_index,:)
m(two_index,:)
m(three_index,:)

希望能有所帮助。

@High-Performance Mark
感谢您的快速回复。你能看看我的问题吗update@noufal对循环使用
,并从3迭代到0。这有多难?@noufal,代码标记为您提供了用N个零提取所有行的功能。您现在所要做的就是对从3到0运行的
循环执行
,即对N=3:-1:0执行
,并在每次迭代中执行这一行(如果您愿意,可能会将结果附加到某个最终矩阵)。@noufal为了您的方便,我将代码添加到了答案中。@noufal-oops。我使用了
tf
,然后将其重命名为
rows
。修正了。我可能忽略了一些东西-但是你不是按照这个特定的顺序生成矩阵吗?在MATLAB中使用动态分配通常被认为是不好的做法。更具体地说,您是矩阵
zero\u index
one\u index
等等。。。在
for
循环中不断增长。您应该为它们预先分配内存。@在我的问题中,我已经预先分配了内存,因为我知道生成的矩阵的大小,如果我们不确定矩阵的大小,该怎么办?@noufal然后超过预先分配,然后删除不必要的部分。在大多数情况下,如果您不能确定矩阵的最终大小,您至少可以绑定矩阵的维度。@EitanT,非常感谢。我会照顾好它的,我明白用你的方式来解释这个问题的逻辑。给出的例子有点误导。无论如何都要有+1。