我正在尝试解决这个问题:
编写一个名为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
答案 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。