##我想编写一个接收数组作为参数的函数,然后使用循环更好地打印数组的外部值。
e.g。如果A = [1,2,3,4; 5,6,7,8; 9,10,11,12]
然后调用printFrame(A)将显示在代码中。
这是我能得到的,所以我得到一个中间只有0的数组,不知道这种方式是否能引导我达到最终目的----打印数组的帧##
% the text was not showing clear enough I want it to display like the following
1 2 3 4
5 8
9 10 11 12
function F = printFrame(A)
mat = [];
[m,n]=size(A);
for i=1:n
e = A(1,i);
mat = [mat,e];
end
for j=2:(m-1)
e = A(j,1);
mat = [mat,e];
for k = 2:(n-1)
A(j,k)=0;
g = A(j,k);
mat = [mat,g];
end
e = A(j,end);
mat = [mat,e];
end
for i=1:n
h = A(end,i);
mat = [mat,h];
end
for l = 1:length(mat);
F = fprintf('%5d',mat(l));
if rem(l,n) == 0
fprintf('\n');
end
end
fprintf('\n\n')
end
答案 0 :(得分:0)
我相信这样的事情应该足够强大。我确信有一个更聪明的解决方案,但这似乎有效
A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12];
dims = size(A);
logicalmatrix = true(dims);
logicalmatrix(2:end-1, 2:end-1) = false;
A = A.'; % Transpose because MATLAB works column-wise
output = A(logicalmatrix);
编辑,根据您的评论:
A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12];
dims = size(A);
A = arrayfun(@num2str, A, 'UniformOutput', 0).';
A(2:end-1, 2:end-1) = repmat({''}, dims - 2);
outstr = sprintf(strcat(repmat('%2s ', [1, dims(2)]), '\n'), A{:})
返回:
outstr =
1 2 3 4
5 8
9 10 11 12
与我的上述答案一样,我确信这是一个聪明的解决方案。虽然更紧凑,但我不确定arrayfun
调用是否比for
循环更快。这应该是相当健壮的,唯一不健壮的是sprintf
调用中的字符串输出(%2s
部分),我包括它以确保单元格被均匀填充,否则你得到这个:
outstr =
1 2 3 4
5 8
9 10 11 12
您必须将值更改为最大数字的宽度(如果为负数,则为负号)。我一直在考虑为此提供一些强大的解决方案,但还没有完全找到一个优雅的解决方案。
答案 1 :(得分:0)
使用bsxfun
创建一个掩码并将其应用为logical index。需要调换A
以获得所需的顺序(首先是行,然后是列)。
B = A.'; %'
mask = bsxfun(@or, [1 zeros(1,size(B,2)-2) 1], [1; zeros(size(B,1)-2,1); 1]);
result = B(mask).'; %'
disp(result)
答案 2 :(得分:0)
这很简单,我可以做到。生成的矩阵包含字符串而不是数字值,但如果您只是将其打印出来应该没问题。
A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12];
S = num2str(A);
S(2:end-1,2:end-1)=' ';
disp(S);
输出是:
1 2 3 4
5 8
9 10 11 12