2016-07-07 57 views
-2

我想將矩陣中的每個元素從1到10的值轉換成10x1的零矩陣,其中零矩陣的元素對應於原始值元素等於1Octave:用矢量替換matix/vector的元素

下面是代碼:

function q = convert 

% Convert y matrix values to 10x1 vector 

load('y.mat'); 

ZERO = zeros(10,1); 

% Set 10x1 Matrix of zeros 

for i = 1:length(y) 

    ZERO(y(i)) = 1; % Set yth element of ZERO to 1 

    y(i) = ZERO; % Set ith element of y equal to new zero 

    ZERO = zeros(10,1); % Re-establish zero 

endfor 

當我運行它,我得到的錯誤A(I) = X: X must have the same size as I。我嘗試輸入的矩陣與矩陣y的元素的大小不一致。我能解決這個問題嗎?

樣品輸入:

y = [1; 2; 3; 4; 5] 

輸出示例:

y = [[1;0;0;0;0;0;0;0;0;0], 
    [0;1;0;0;0;0;0;0;0;0], 
    [0;0;1;0;0;0;0;0;0;0], 
    [0;0;0;0;1;0;0;0;0;0], 
    [0;0;0;0;0;1;0;0;0;0]] 
+1

你能給我們一些樣本輸入和相應的預期輸出嗎? – beaker

+0

y = [1; 2; 3; 4; 5]輸入並且y = [[1; 0; 0; 0; 0; 0; 0; 0; 0; 0]; [0; 1; 0; 0; 0; 0; 0; 0; 0; 0] ; [0; 0; 1; 0; 0; 0; 0; 0; 0; 0]; [0; 0; 0; 0; 1; 0; 0; 0; 0; 0]; [0; 0; 0; 0; 0; 1; 0; 0; 0; 0]輸出。我通過在需要的地方按元素執行轉換元素來解決這個問題。我只是希望能像這一樣一步到位。 –

回答

0

我會做一些假設:

  1. 你想返回值是q爲在函數簽名中,並且
  2. 你想在你的樣本情況下的輸出是一個10x5矩陣,像這樣:

    1 0 0 0 0 
    0 1 0 0 0 
    0 0 1 0 0 
    0 0 0 1 0 
    0 0 0 0 1 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    

固定循環

給出錯誤的問題是,你將10x1載體ZERO分配給5x1載體的單個(標量)元件y

y(i) = ZERO; 

一個向量不適合標量。但是,即使您將此更改爲將ZERO分配給y列,也不適合,因爲列的長度不同。這不是你想要做的,因爲如果它有效的話,你可能只會抹去y中的值。所以讓我們設置輸出數組q的列中的值。變動(標有註釋<==。)

function q = convert 
% Convert y matrix values to 10xn matrix 

%load('y.mat'); 
y = [1; 2; 3; 4; 5]; % <== replace load temporarily 

% Set 10x1 Matrix of zeros 
ZERO = zeros(10,1); 
% Preallocate output array 
q = zeros(10, length(y)); % <== preallocate for speed 

for i = 1:length(y) 
    ZERO(y(i)) = 1;  % Set yth element of ZERO to 1 
    q(:,i) = ZERO;  % <== Set ith *column* of *q* equal to new zero 
    ZERO = zeros(10,1); % Re-establish zero 
endfor 

改善循環

這將工作,但如果你預先分配q,你已經得到的ZERO正確的號碼向量,爲什麼不直接設置值?

function q = convert 
% Convert y matrix values to 10xn matrix 

%load('y.mat'); 
y = [1; 2; 3; 4; 5]; % <== replace load temporarily 

% Preallocate output array 
q = zeros(10, length(y)); % <== preallocate for speed 

for i = 1:length(y) 
    q(y(i),i) = 1;  % <== Set element at y(ith) row and ith column of q to 1 
endfor 

查殺環

這兩種循環會給你想要的結果,但你可以做到這整個操作沒有環。This answer總結了不同的方式來做到這一點,但我只告訴你使用sub2ind第一個:

function q = convert 
% Convert y matrix values to 10xn matrix 

%load('y.mat'); 
y = [1; 2; 3; 4; 5]; % <== replace load temporarily 

% Preallocate output array 
q = zeros(10, length(y)); % <== preallocate for speed 

idx = sub2ind(size(q), y, [1:length(y)].'); 
q(idx) = 1; 

最後說明

最好不要使用i作爲一個變量名八度/ MATLAB。這在其他語言中很自然,但在MATLAB i(或j)中是imaginary unit。如果您使用i作爲變量,它會隱藏該常數。如果您在分配複雜值時使用1i(或1j),但這不會產生影響,但您必須記住這樣做,並且在某些時候您將忘記。