どなたかMATLABとVC++6両方わかる方おられますか? – プログラミング – Home

どなたかMATLABとVC++6両方わ...
 
通知
すべてクリア

どなたかMATLABとVC++6両方わかる方おられますか?


かっぷ
 かっぷ
(@かっぷ)
ゲスト
結合: 17年前
投稿: 1
Topic starter  

MATLABで下記のプログラムです。
これを、VC++6に書き直すとどうなるのでしょうか?

Normは行列のノルム、rankはやはり行列の階数だと思うのですが、
このへんの演算も、VC++6では
関数で書かないといけないのでしょうか?
nergin < とかisempty()とか
svd()とか、sDiag()とか(対角行列か?)
いきなり括弧でくくる[U,S,V] = とかB = []とか
このへんも、何をやっているのかわかりません。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function[Y,W,b,M] = abc(X, numIC,econv,max_itr)
% Initialization

if (nergin < 5), display = 0; end
if isempty(display), display = 0; end

if nargin < 4, max_itr = 1000, end
if isempty(max_itr), display = 1000; end

if nargin < 3, econv = 0.00001; end
if isempty(numIC), numIC = 0; end

if nargin < 2, numIC = 0; end
if isempty(numIC), numIC = 0; end
[rowX,colX] = size(X);
if unmIC == 0 | numIC>rank(X) numIC=rank(X); end

% Globe Transform
[U,S,V] = svd(X,0)
Sdiag = diag(S(1:numIC,1:numIC));
Sdiag0 = find(Sdiag == 0)
for i=;length(Sdiag0)
Sdiag(1,Sdiag0(i) = inf;
end

M = V(:,1:numIC)*diag(1./Sdiag)*sqrt(rowX); % shering
U = U(:,1:numIC)*sqrt(rowX); % normizing PCs (scores)
clear S V Sdiag Sdiag0

%------ ABC ---------
B = [];
irr_fail = 0;
i = 1;
while i <=numIC
w_old = rand(numIC, 1) - 0.5;
if i > 1, w_old = w_old-B*B'*w_old; end
w_old = w_old/norm(w_old);
for itr=1:max_itr
w = (U'*((U*w_old).^3))/roxX-3*w_old;
if i>1
w = w -B*B'*w;
end
w = w/norm(w);
if min(norm(w-w_old),norm(w+w_old))<econv
irr_fail = 0;
i = i + 1;
B = [B w];
break
end
w_old = w;
if isr == 1000
itr_fail = itr_fail + 1;
irr_fail = 5,error('Error !'), end
break
end
end
end

% Result
Y = U*B;
W = M*B;


引用解決済
トピックタグ
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

俺もわからん。
MATLABの説明とかネット上で見ながら何とかなるかなあ?
ということで相当推測が入るし間違えているかもしれません。

MATLABは引数に行列渡して受け取り側で行列の部分へ受け取れるから器用だよね。
C/C++だと多次元配列は予めサイズが決まっていたり
実際に渡すのは配列の先頭アドレスだし
受け取るのも先頭アドレス。

> [U,S,V] = svd(X,0)
たぶんsvdは3つの値を返す。
それを[U,S,V]で受け取る。
スクリプトみたいな言語だからC/C++系では大変だね。

MATLABはインデックスが1から始まるから
0から始まる言語に移植となると正直なところ嫌な言語だよね。

> B = []
たぶん空の行列


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

C/C++だと配列のサイズを知ることが出来ないんだよな。

int a[10];
これはa[0]からa[9]って判るけど
void function(int * b)
{
// b[]が何個か判らない。
}

もしサイズが固定ならそれように作ってしまえばいい。

行列はサイズも次元数も任意だから汎用的に作るとなると
C/C++言語は大変だね。サイズ不定で多次元配列なんて出来ない。
C++クラスで行列を自作か?
ネットで見ると作っている人いるみたいだね。
std::vector<std::vector<int> >じゃたぶん使いにくい。

> Sdiag = diag(S(1:numIC,1:numIC));

MATLABは行列の一部分だけを渡すとかできる。
C/C++だとそんなのないから大変だな。

>function[Y,W,b,M] = abc(X, numIC,econv,max_itr)

たぶんやらされている仕事だと思うけど
MATLABを知らないあなたに勉強のために
abcっていう関数だけC++にしろっていわれたんだろうな。

abcを使う側の関数をどう作るかにも影響するから
勝手に決めて作ったりやたらと仕様変更できないから難しいな。

4つの行列を返す関数みたいだがそんなのC/C++では出来ないから
引数で値を返し、戻り値はエラーを示す数値を返すとかかな。

それ以前に行列を表す型がC/C++にないからどうするかだよ。

逆にそのあたりは好きなように決めて作っていいってことか。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> それ以前に行列を表す型がC/C++にないからどうするかだよ。

valarray使ってなんとかすんでしょねー


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました