Matlab 当指数之和为偶数时,输出矩阵大小n x m,1,否则为0
我试着将以下内容作为一种爱好,而不是作为家庭作业。在使用MATLAB进行计算机编程时:J.Michael Fittrick和Akos Ledeczi,有一个实践问题要求: 编写一个名为Matlab 当指数之和为偶数时,输出矩阵大小n x m,1,否则为0,matlab,matrix,Matlab,Matrix,我试着将以下内容作为一种爱好,而不是作为家庭作业。在使用MATLAB进行计算机编程时:J.Michael Fittrick和Akos Ledeczi,有一个实践问题要求: 编写一个名为alternate的函数,将两个正整数n和m作为输入参数(该函数不必检查输入的格式),并返回一个矩阵作为输出参数。n-by-m输出矩阵的每个元素,其索引之和为偶数为1。 所有其他元素都为零 前面的一个问题与此类似,我编写了一个非常简单的函数,它可以满足要求: function A = alternate(n,m)
alternate
的函数,将两个正整数n
和m
作为输入参数(该函数不必检查输入的格式),并返回一个矩阵作为输出参数。n
-by-m
输出矩阵的每个元素,其索引之和为偶数为1。
所有其他元素都为零
前面的一个问题与此类似,我编写了一个非常简单的函数,它可以满足要求:
function A = alternate(n,m)
A(1:n,1:m)=0;
A(2:2:n,2:2:m)=1;
A(1:2:n,1:2:m)=1;
end
现在我的问题是,这足够好吗?它精确地输出它所要求的,但它不检查总数。到目前为止,我们还没有讨论嵌套if语句或任何类似的语句,我们只是开始讨论非常基本的函数。我觉得赋予它更多的功能可以让它更好地循环使用,以备将来使用。很高兴看到您正在学习,学习任何编程语言的第一步应该是确保您始终添加相关注释!这有助于您和任何阅读您的代码的人。因此,第一个改进是:
function A = alternate(n,m)
% Function to return an n*m matrix, which is 1 when the sum of the indices is even
A(1:n,1:m)=0; % Create the n*m array of zeros
A(2:2:n,2:2:m)=1; % All elements with even row and col indices: even+even=even
A(1:2:n,1:2:m)=1; % All elements with odd row and col indicies: odd+odd=even
end
但是,您可以使其更加简洁(打折评论),并且可能更清楚地与摘要相关:
function A = alternate(n,m)
% Function to return an n*m matrix, which is 1 when the sum of the indices is even
% Sum of row and col indices. Uses implicit expansion (R2016b+) to form
% a matrix from a row and column array
idx = (1:n).' + (1:m);
% We want 1 when x is even, 0 when odd. mod(x,2) is the opposite, so 1-mod(x,2) works:
A = 1 - mod( idx, 2 );
end
这两个函数做相同的事情,您应该使用个人偏好(以及与大问题相关的性能)
我认为,即使没有评论,我写得更清楚的替代方案也能做到罐上写的内容。你不必知道摘要就可以理解你在寻找偶数索引和,因为我已经做了求和并测试了偶数。您的代码需要解释
它也可以写为一行,而索引方法不能(正如您所做的那样)
您的函数工作正常并输出所需的结果,让我向您推荐一个替代方案:
function A = alternate(n,m)
A = zeros( n , m ) ; % pre-allocate result (all elements at 0)
[x,y] = meshgrid(1:m,1:n) ; % define a grid of indices
A(mod(x+y,2)==0) = 1 ; % modify elements of "A" whose indices verify the condition
end
返回:
>> alternate(4,5)
ans =
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
初始化: 第一行与第一行等效,但这是创建新矩阵的cannonical MATLAB方法。 它使用函数 请注意,MATLAB具有类似的功能,可以为不同类型创建和预分配矩阵,例如:
- 创造
一个由
组成的矩阵,大小double
,所有元素都设置为[n,m]
1
- 创建一个
双重
矩阵,大小
,所有元素设置为[n,m]
NaN
- 创建一个
布尔值的矩阵
大小
,所有元素设置为[n,m]
false
指数 第二行生成两个矩阵
x
和y
,它们将成为A
的索引。它使用函数。例如,在上面所示的情况下,x
和y
看起来像:
| x = | y = |
| 1 2 3 4 5 | 1 1 1 1 1 |
| 1 2 3 4 5 | 2 2 2 2 2 |
| 1 2 3 4 5 | 3 3 3 3 3 |
| 1 2 3 4 5 | 4 4 4 4 4 |
奇偶指数 要计算指数的
和
,现在在MATLAB中非常简单,如下所示:
>> x+y
ans =
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
现在我们只需要知道哪些是偶数。为此,我们将在这个求和矩阵上使用模运算符()
>> mod(x+y,2)==0
ans =
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
该结果逻辑矩阵的大小与A
相同,并且包含1
,其中索引之和为偶数,否则为0
。我们可以使用此逻辑矩阵仅修改满足以下条件的A
元素:
>> A(mod(x+y,2)==0) = 1
A =
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
请注意,在这种情况下,在上一步中找到的逻辑矩阵是正常的,因为要分配给特殊索引的值是1
,这与MATLAB的true
的数字表示相同。如果要指定不同的值,但索引条件相同,只需替换上一个赋值:
A(mod(x+y,2)==0) = your_target_value ;
我不喜欢破坏学习。让我给你一些提示 如果你对向量而不是单个元素进行运算,Matlab是非常有效的。那么,为什么不创建包含所有索引的两个矩阵(例如,
N,M
)呢?请查看meshgrid()
函数。
这样,您就可以在一行中找到索引数为偶数和的所有位置
第二个提示是逻辑运算的输出,例如B=a==4
,生成一个逻辑矩阵。您可以使用B=double(B)
将其转换为零矩阵
玩得开心 这可能更适合那个好的。我迫不及待地想使用隐式扩展(仍然停留在R2016a上)…@Hoki您可以随时使用
bsxfun
:)
A(mod(x+y,2)==0) = your_target_value ;