【发布时间】:2019-05-16 15:15:31
【问题描述】:
我正在尝试以下作为一种爱好,而不是家庭作业。我是 MATLAB 新手,一般编码知识有限。我有一个问题,我被困住了。来自使用 MATLAB 进行计算机编程:J. Michael Fitzpatrick 和 Akos Ledeckzi
问题 10. 编写一个名为 cancel_middle 的函数,它接受 A,一个 n-by-m
矩阵,作为输入,其中 n 和 m 都是奇数,k 是正数
小于 m 和 n 的奇数(函数不必
检查输入)。该函数返回输入矩阵,其中心 k 由 k 矩阵归零。看看下面的运行,
>> cancel_middle(ones(5),3)
ans =
1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
我有一个可以正确执行输入参数的嵌套 if 函数,但我无法获得所需的输出。我相信它远没有效率,我使用 if 语句,即使它没有在书中涉及。这是我以前的知识。所以我认为有一个更简单、更高效的函数要编写。
function M = cancel_middle(A,k);
[m,n] = size(A);
if rem([m,n],2) == [1,1]
if rem(k,2)==1
if [k,k]<[m,n]
M = zeros(k);
else
fprintf('Error 1: k must be odd and smaller than A\n');
end
else
fprintf('Error 2: k must be odd and smaller than A\n');
end
else
fprintf('Error 3: k must be odd and smaller than A\n');
end
我坚持的区域是应该在第 8 行的输出参数。我正确地输出了 k×k 矩阵,但由于显而易见的原因,它不在更大的矩阵上。我相信我想将矩阵 zeros(k) 索引到更大的矩阵 A 上。我相信我缺少一些关键函数,这些函数也可以让我免于使用 3 个 if 语句,但我对此一无所知.
这是我运行函数时的输出:
>> cancel_middle(ones(5),3)
ans =
0 0 0
0 0 0
0 0 0
显然它只是 zeros(k) 输出。
【问题讨论】:
-
到目前为止,您的大部分代码似乎都在检查输入(您的问题并不特别要求)。与其创建一个单独的零矩阵,不如考虑如何计算 A 的哪些元素应该变为零的索引并直接设置它们......
-
@etmuse 我正在运行这些检查,因此该函数可以确定输入是否确实是问题所要求的。因此,如果我输入一个大小为 4×4 的矩阵,我会按预期得到一个错误。我确实喜欢您将 A 的指定元素更改为零而不是创建单独的零矩阵的方法。谢谢
-
@SardarUsama,是的!绝对是一个强大的副本。这个任务必须是重复的......
标签: arrays matlab matrix indexing