Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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 当指数之和为偶数时,输出矩阵大小n x m,1,否则为0_Matlab_Matrix - Fatal编程技术网

Matlab 当指数之和为偶数时,输出矩阵大小n x m,1,否则为0

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)

我试着将以下内容作为一种爱好,而不是作为家庭作业。在使用MATLAB进行计算机编程时:J.Michael Fittrick和Akos Ledeczi,有一个实践问题要求:

编写一个名为
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 ;