初学者 - 如何在Matlab中打印数组的外部值?

时间:2015-04-01 13:22:32

标签: arrays matlab

##我想编写一个接收数组作为参数的函数,然后使用循环更好地打印数组的外部值。

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

3 个答案:

答案 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