我尝试编码,但我不知道从哪里开始。
答案 0 :(得分:2)
在我看来,这似乎是一个相对愚蠢的MATLAB作业,特别是因为
无论如何......如果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.').';
(我将把这种方法作为练习,直到你展示出寻找解决方案的努力......)
答案 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
代码基本上遍历矩阵中的每个元素,并检查元素是否为非零。如果是,则将此元素附加到F
。 end+1
很重要,因为end
是MATLAB中的一个特殊关键字,用于访问数组的 last 元素。通过执行end+1
,我们告诉MATLAB我们要在数组的末尾添加一个元素。当我们开始将非零元素添加到F
时,此代码将允许F
增长。但是,将它放入MATLAB编辑器时可能会收到警告。具体来说,MATLAB会要求您preallocate your array来提高性能。这是因为如果在阵列顶部添加额外的空间,这会降低性能,而如果分配适当的空间,则不会不必要地增加空间。但是,由于F
中的元素数量较少,因此如果您使用上述代码,则不会有任何显着的性能提升。
FWIW,这是使用示例中定义的F
时U
的输出:
>> format compact
>> F
F =
3 5 2 1 9 6 5 9 8 4 5 2 6 3 5