質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

1回答

1599閲覧

メモリ不足を引きおこさずかつ高速に所望の行列を作成する方法について

xdgy

総合スコア4

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2020/04/28 11:06

編集2020/04/28 11:10

実現したいこと

例えば、次のような行列Vと、スパース行列Aが与えられているとします。
イメージ説明
この2つの行列を用いて、以下のような3d×5のスパース行列を作成したいです。
イメージ説明

試したこと

理論上は、以下のコードを用いると、得たい行列は作成できます。

matlab

1repmat(V,3,1).*repelem(A,d,1)

例えば、d=2として、行列Vが、
イメージ説明
の場合、

matlab

1>> A = sparse([0,1,0,0,0;1,-1,1,0,1;-1,0,0,1,0]); 2>> V = [1,2,3,4,5;6,7,8,9,10]; 3>> full(repmat(V,3,1).*repelem(A,2,1)) 4 5ans = 6 7 0 2 0 0 0 8 0 7 0 0 0 9 1 -2 3 0 5 10 6 -7 8 0 10 11 -1 0 0 4 0 12 -6 0 0 9 0

となります。
しかしながら、この方法では、計算の途中で以下の3d×5の密行列を計算する必要があります。

matlab

1>> repmat(V,3,1) 2 3ans = 4 5 1 2 3 4 5 6 6 7 8 9 10 7 1 2 3 4 5 8 6 7 8 9 10 9 1 2 3 4 5 10 6 7 8 9 10

そのため、Aの行数「3」や、Aの列数「5」が大きくなった場合に、PCのメモリ不足を引き起こします。
行列演算をなるべく使い(for文などのMatlabの実行時間が長くなるようなものを極力使わない)、かつPCのメモリ不足を引き起こさない方法を思いつく方はいますでしょうか?

Matlabのバージョン

R2020a

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでしょうか。

matlab

1B=cell2mat( arrayfun(@(i) kron(A(:,i),V(:,i)) , 1:size(A,2), 'uni',0) );

投稿2020/04/30 01:45

WathMorks

総合スコア1582

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xdgy

2020/04/30 04:21

arrayfunという関数があるのは知りませんでした。このコードで実際のデータに対して適用してみましたが、メモリ不足も引き起こさず、かつ以前のコードでメモリ不足を引き起こさなかったデータに対しても、より高速に計算できました。この度はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問