2015-04-01 188 views
0

##我想寫一個接收數組作爲參數的函數,然後使用循環更好地打印數組的外部值。初學者 - 如何在Matlab中打印數組的外部值?

例如如果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

你真的需要定義什麼是這種「外部價值」 ......沒有任何意義,我(除非有人能解釋一下)...... – ha9u63ar 2015-04-01 13:29:50

+0

對不起,但我已經添加了我希望在我的代碼中的格式,希望這會更有意義。謝謝。 – Chaney 2015-04-02 00:42:05

回答

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 

您必須將值更改爲您的最大號碼的寬度(如果爲負號,則爲負號)。我一直在考慮爲此提供一些強大的解決方案,但尚未解決優雅的問題。

+0

我很抱歉引起所有的困惑,我已經將我想要的數組的格式添加到我的代碼的前幾行。我需要它是一個矩陣而不是矢量。像數組的一個框架,但只顯示外部值。希望這會更有意義,請看看。謝謝。 – Chaney 2015-04-02 00:51:58

+0

@Chaney看到我的編輯 – excaza 2015-04-03 12:27:13

0

使用bsxfun創建一個遮罩並將其應用爲logical indexA需要轉置以獲得您想要的訂單(先行,後列)。

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) 
+0

我很抱歉引起所有的困惑,我已經將我想要的數組的格式添加到我的代碼的前幾行,希望這會更有意義,請採取看。 此外,初學者可以使用哪些更簡單的功能來實現這個功能?像循環?因爲這個看起來有點困惑。 謝謝。 – Chaney 2015-04-02 00:49:26

+0

@Chaney它可以用循環完成,但在Matlab中,您通常會嘗試避免循環。 'bsxfun'有點「高級」,是的,但它是一個非常有趣和靈活的功能,所以我建議[閱讀它](http://ubcmatlabguide.github.io/html/speedup.html#29) – 2015-04-02 04:07:44

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