2017-08-07 12 views
0

Iオクターブで次のコードを、有する:行列変換を行う際に「関数を使用する」方法

% recode y to Y 
I = eye(10); 
Y = zeros(5000, 10); 
for i=1:5000 
    Y(i, :)= I(y(i), :); 
end 

yは、所望の出力がY. Yであり、X 1 5000であり、1から10 に値が含まれて5000×10であり、1を除いてすべて0が含まれてい同じ列のyに示された位置にある。

私はこれをループなしで学業目的で行う必要があります。すなわちベクトル化する。

5000 x 1 * 1 x 10は私に5000 x 10の答えを与えますが、ここで1 x 10は各行が "現在の"行で示される位置を除くすべての0を含む行列乗算の間に変更する必要がありますyの

どうすればいいですか?

+0

あなたの質問は、より適切なStackOverflowに思えると思います。いずれにしても、単に論理的な索引付けを検索してください。これにより、あなたが望むソリューションが得られます。 –

答えて

1

それはeye(10)(r,c)がそうのように、引数rのためのベクトルを取ることができることが判明した:

Y = eye(10)(y,:) 

私はちょうど今、試行錯誤を介してこれを発見しました。それは正しい答えを与えるように見え、ループは必要ありません。はるかに簡単で、うまくいけば速いです。とにかく「チェーン・インデックス」(..)(...)は(MATLABで利用できません)オクターブの追加で、「行列の掛け算をしながら機能を使用する」とは何の関係もありません

の使用

1

あなたは使用することができます...あなたがスピードアップ率は> 500とメモリ使用量だけで10分の見ることができるように

c = 5e3; 
r = 10; 
y = randi (c, r, 1); 

## Answer from toddmo 
tic 
Y = eye(c)(y,:); 
toc 

## Answer from Andy 
tic 
Y2 = sparse (1:r, y, 1, r, c); 
toc 

## Ensure, that they are equal 
assert (Y, full (Y2)); 

## check the size in memory 
whos 

Elapsed time is 0.0635939 seconds. 
Elapsed time is 0.000108957 seconds. 
Variables in the current scope: 

Attr Name  Size      Bytes Class 
==== ====  ====      ===== ===== 
    Y   10x5000     400000 double 
    Y2   10x5000     40168 double 
    ans   5x10      400 double 
    c   1x1       8 double 
    r   1x1       8 double 
    y   10x1       80 double 

Total is 100062 elements using 440664 bytes 

できます:あなたは、作成と保存のための疎行列を使用する必要があります疎完全な行列を使用する場合とほとんど変わりません。あなたが本当に必要な場合はそれを変換するためにfullを使用してください

+0

最初のステートメントについては、「行列変換を実行しながら関数を使用する」という意味でした。私の答えが使用する、連鎖インデックスと呼ばれる機能は、アルゴリズム上の意味での機能です。それはルックアップ機能です。タイトルを修正しました。 – toddmo

+0

「疎」は分かりません。それが何であるか、引数が何であるか、またはそれらが関数によってどのように関連または使用されているかを示します。とにかくあなたの答えを見るだけではありません。また、 'r'(行)と' c'カラムの通常の意味を逆転させました。 '5e3'は事を明確にします。私の答えが目(10)であれば、あなたはそれを 'eye(5000)'と間違って呼んでいます。 – toddmo

+0

あなたは正しいです、私は答えの行と列の数を切り替えました。 5e3は5000の科学記法です(大丈夫ですか?)。スパース行列は0を格納しません(あなたの場合は90%です)。 – Andy

関連する問題