如何在具有奇数列和行的输入矩阵中用k矩阵将中心k归零

时间:2016-01-26 10:02:19

标签: matlab matrix

我正在尝试解决这个问题:

  

编写一个名为cancel_middle的函数,它取A,n-by-m   矩阵,作为n和m都是奇数的输入,k是正数   奇数,小于m和n(函数不必   检查输入)。该函数返回输入矩阵,其中心为k-by-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

我的代码仅在k=3时有效。如何对k的所有奇数值进行推广?这是我到目前为止所做的:

function test(n,m,k)
   A = ones(n,m);
   B = zeros(k);
   A((end+1)/2,(end+1)/2)=B((end+1)/2,(end+1)/2);

   A(((end+1)/2)-1,((end+1)/2)-1)= B(1,1);
   A(((end+1)/2)-1,((end+1)/2))= B(1,2);
   A(((end+1)/2)-1,((end+1)/2)+1)= B(1,3);

   A(((end+1)/2),((end+1)/2)-1)= B(2,1);
   A(((end+1)/2),((end+1)/2)+1)= B(2,3);

   A(((end+1)/2)+1,((end+1)/2)-1)= B(3,1);
   A(((end+1)/2)+1,((end+1)/2))= B(3,2);
   A((end+1)/2+1,(end+1)/2+1)=B(3,3)
end

2 个答案:

答案 0 :(得分:1)

您可以简化代码。请看 Matrix Indexing in MATLAB。 “行和列下标中的一个或两个可以是向量”,即您可以定义子矩阵。然后你只需要正确编制索引:因为你有奇数只是减去mk和nk而你有旧矩阵A剩余的元素数。如果你将它除以2你得到左/右的填充,顶部/底部。而另一个+ 1 / -1因为Matlab索引。

% Generate test data
n = 13;
m = 11;
A = reshape( 1:m*n, n, m )
k = 3;

% Do the calculations
start_row = (n-k)/2 + 1
start_col = (m-k)/2 + 1
A( start_row:start_row+k-1, start_col:start_col+k-1 ) = zeros( k )

答案 1 :(得分:0)

function b = cancel_middle(a,k)
[n,m] = size(a);
start_row = (n-k)/2 + 1;
start_column = (m-k)/2 + 1;
end_row = (n-k)/2 + k;
end_column = (m-k)/2 + k;
a(start_row:end_row,start_column:end_column) = 0;
b = a;
end

我在一个名为cancel_middle的m文件中创建了一个函数,它基本上将中心k由k矩阵转换为零矩阵,其尺寸相同,即k by k。 矩阵的其余部分保持不变。这是一个常规函数,您需要输入2个输入,即要转换的矩阵和子矩阵的阶数,即k。