2013-09-23 79 views
7

在找到how empty structs are dealt with中的一些邏輯之後,我想檢查這是如何推廣到矩陣的。1x1矩陣的第一個元素和1x1矩陣的所有元素之間的區別

在這裏,我注意到以下幾點:

如果你有一個1x1矩陣,並分配給第一要素。這與分配給所有元素不一樣。

這讓我很吃驚,因爲第一個元素與本例中的所有元素都是一樣的。這裏是我的意見:

x = 1; 
y = 1; 
z = 1; 

x(:) = []; % Evaluates to [] as I expected 
y(1) = []; % Evaluates to Empty matrix: 1-by-0, rather than [] 
z(1,1) = []; %Throws an error: 'Subscripted assignment dimension mismatch.' even though size(z) gives [1 1]; 
z(1,:) = []; % Evaluates to Empty matrix: 0-by-1, just like z(:,:) = [] 

看到這個,我的問題後:

爲什麼分配以不同的方式同樣的事情,導致四個不同的結果?

+3

你只是感興趣,或者這是一個實際問題嗎? –

+1

@DennisJaheruddin你應該在TMW的QA團隊中工作:) –

+0

@SamRoberts問題*爲什麼*最不受歡迎,但特別是第一種和第四種情況之間的差異使我擔心我的代碼的健壯性。因此,這不僅是一個問題,也是一個警告。 –

回答

9

這似乎是一個一致的東西。

讓我們考慮一個更大的矩陣,看看行爲是有1 -by- 1矩陣是一致的(擾流警報,這是在我看來):

X = rand(3); 

案例1:

X(1,1) = [] 

這對工作毫無意義。我們無法保留形狀並放棄單個元素,因此我們會得到尺寸不匹配錯誤,這與您的觀察結果一致。尺寸不匹配也是一個適當的錯誤,因爲我們試圖強制0矩陣進入1 -12-插槽。 (順便說一句在一個側面說明,你說size(z)給你[1 1]size(z, 3)也給你1也是如此size(z,7)等所以實際上它是一個[1 1 1 ...矩陣)

案例2:

X(1) = [] 

這導致X這樣size(X)1 -by- 8,MATLAB似乎很樂意線性化你的矩陣,如果你指定了一個線性索引。這對我來說很有意義,並再次與1 -by- 1情形相一致的,因爲它會導致1 -by- numel(X)-1矩陣(即1 -by- 0X = 1

案例3:

X(1,:) = [] 

這很簡單,刪除第一行,現在我們有一個n-1 -by-m矩陣。因此,一個3 -by- 3成爲2 -by- 3所以我很高興有1 -by- 1在這種情況下成爲0 -by- 1。請注意0​​也是一致的。

案例4:

X(:) = [] 

這一個很有道理的,重新分配整個矩陣。沒有問題。沒有歧義。

因此,即使確定,他們都可以毫不含糊地表示同樣的事情。我認爲這是一個完全合理的設計選擇,讓MATLAB有與大矩陣一致的不同結果,而不是對單個單元矩陣做同樣的事情。

+1

錯字:案例3應該是'X(1,:)= []'與描述一致 – Amro

+0

@Amro謝謝,糾正 – Dan

+5

@丹現在看起來多麼清楚! :-) –