bsxfunっぽいもの

投稿日: 更新日:

function [ out ] = bsxfun( func, target, data )
%[ out ] = bsxfun( func, target, data )
%MATLABの新しいのにある、bsxfunっぽいもの。
%http://www.mathworks.co.jp/access/helpdesk_ja_JP/help/techdoc/ref/bsxfun.html
%『入力』
%func   種類
%target A
%data   B
%『出力』
%out    出力

name  = func2str(func);
MINUS   = 0;
TIMES   = 1;
RDIVIDE = 2;
LDIVIDE = 3;
PLUS   = 4;

type = -1;
if strcmp(name,'plus'),
     type = PLUS;
elseif strcmp(name,'minus'),
     type = MINUS;
elseif strcmp(name,'times'),
     type = TIMES;
elseif strcmp(name,'rdivide'),
     type = RDIVIDE;
elseif strcmp(name,'ldivide'),
     type = LDIVIDE;
end

%row    height
%column width

[row,   column] = size(target);
[height, width] = size(data);

if ((height==1)&&(width==1)),
     if (type == PLUS),
          out = target + data;
     elseif (type == MINUS),
          out = target – data;
     elseif (type == TIMES),
          out = target .* data;
     elseif (type == RDIVIDE),
          out = target ./ data;
     elseif (type == LDIVIDE),
          out = target .\ data;
     end
else
     out = zeros(row,column);
     for x=1:row,
          for y=1:column,
               a = mod(x – 1,height) + 1;
               b = mod(y – 1,width)  + 1;
          if (type == PLUS),
               out(x,y) = target(x,y) + data(a,b);
          elseif (type == MINUS),
               out(x,y) = target(x,y) – data(a,b);
          elseif (type == TIMES),
               out(x,y) = target(x,y) * data(a,b);
          elseif (type == RDIVIDE),
               out(x,y) = target(x,y) / data(a,b);
          elseif (type == LDIVIDE),
               out(x,y) = target(x,y) \ data(a,b);
          end
     end
end

end
広告

コメントをどうぞ(承認された後に公開されます。メールアドレスの記入は自由ですが、記入した場合でも一般公開されることはありません)

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中