提取矩阵的非零值并在MATLAB中显示为向量

时间:2014-12-25 19:19:11

标签: matlab

enter image description here

我尝试编码,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:2)

在我看来,这似乎是一个相对愚蠢的MATLAB作业,特别是因为

  1. 提示是使用两个for循环和一个你真的不需要的if语句,
  2. 它忽略了MATLAB is column-major
  3. 这一事实

    无论如何......如果2D数组U定义如下

    U = [3 5 0 0 2 1;...
         0 9 0 0 0 6;...
         0 0 5 0 0 0;...
         9 8 4 5 2 6;...
         0 0 0 0 0 0;...
         3 5 0 0 0 0];
    

    并且您想要创建一个行向量F,其中包含U的所有非零值(按行收集),这里有两种可能的方法:

    使用reshape和逻辑索引

    F = reshape(U.', [1, prod(size(U))]);
    F = F(F ~= 0);
    

    使用nonzeros(效率更高)

    F = nonzeros(U.').';
    

    天真的方法:使用两个for循环和一个if语句

    (我将把这种方法作为练习,直到你展示出寻找解决方案的努力......)

答案 1 :(得分:1)

这是圣诞节,所以我想我可以使用天真的方法用两个for循环和if语句来写答案。请注意,Jubobs为您提供了更全面,更有效的答案,以实现相同的任务,但我假设您开始学习MATLAB,并且我不想回避任何想要学习它的人!

提示非常明显。您需要两个for循环 - 一个用于遍历行,另一个用于遍历列。您必须访问矩阵中的每个元素,并使用if语句检查元素是否不等于零。如果是这样,您可以将元素添加到向量F

因此,使用这种方法,F最初会为空,因为我们不知道向量的最终大小是多少。因此,您可以这样做:

F = [];
for r = 1 : size(U,1)
    for c = 1 : size(U,2)
        if U(r,c) ~= 0
            F(end+1) = U(r,c);
        end
    end
end

代码基本上遍历矩阵中的每个元素,并检查元素是否为非零。如果是,则将此元素附加Fend+1很重要,因为end是MATLAB中的一个特殊关键字,用于访问数组的 last 元素。通过执行end+1,我们告诉MATLAB我们要在数组的末尾添加一个元素。当我们开始将非零元素添加到F时,此代码将允许F增长。但是,将它放入MATLAB编辑器时可能会收到警告。具体来说,MATLAB会要求您preallocate your array来提高性能。这是因为如果在阵列顶部添加额外的空间,这会降低性能,而如果分配适当的空间,则不会不必要地增加空间。但是,由于F中的元素数量较少,因此如果您使用上述代码,则不会有任何显着的性能提升。

FWIW,这是使用示例中定义的FU的输出:

>> format compact
>> F
F =
     3     5     2     1     9     6     5     9     8     4     5     2     6     3     5

祝你好运,快乐学习!