7

MatlabまたはOctaveで長さの異なる2つのベクトルを追加したいと思います。例えば

aa = [1 2 3 4];
bb = [100 100];

これにより、次のようなベクトルccが生成されます。

cc = [101 102 3 4]

誰かがこれを行う方法を理解できますか?

更新:これは、後でグレースケール画像に変換する信号のコードです。

load train;
t = y;
load chirp;
c = y;

tc = c + [t; zeros(length(c) - length(t),1)];

plot(1:length(tc),tc)

どうもありがとうございました=)

4

4 に答える 4

10

ベクトルのセットを扱う1次元の場合、他の回答は正しい解決策を示します(短いベクトルにゼロをパディングするか、長いベクトルにサブインデックスを使用して加算を実行することを含みます)。ただし、コメントで、最終的に2つのグレースケール画像を一緒に追加したいとおっしゃっていたので、行列のより一般的な2Dソリューションを紹介したいと思いました。

まず、組み込みのMATLABサンプル画像をいくつかロードし、それらのサイズを取得します。

image1 = rgb2gray(imread('peppers.png'));
image2 = imread('cameraman.tif');
[r1, c1] = size(image1);
[r2, c2] = size(image2);

最初にを使用してRGB画像をグレースケールに変換したことに注意してくださいrgb2gray。次に、サイズが2つの画像のサイズの最大値であるゼロの新しいマトリックスを作成します。

newImage = zeros(max(r1, r2), max(c1, c2), 'uint8');

ゼロの行列を画像と同じタイプにして、その後の操作が正しく機能するようにするため、'uint8'の呼び出しに含めたことに注意してください。zerosこれで、マトリックスnewImageは2つの画像のいずれかを含むのに十分な大きさになりました。最後に、次のように画像を新しい画像に追加できます。

newImage(1:r1, 1:c1) = image1;                       % Insert image 1
newImage(1:r2, 1:c2) = newImage(1:r2, 1:c2)+image2;  % Add image 2

そして、あなたはそれらを次のように見ることができます:

imagesc(newImage);
colormap(gray);

ここに画像の説明を入力してください

注:考慮すべき重要なことの1つは、画像に使用するタイプです。通常、MATLABにロードされる画像データのタイプはuint8です。ただし、上記のように2つの8ビット符号なし整数画像を追加すると、ピクセルが255の値(8ビット符号なし整数の最大値)を超えると飽和状態になる可能性があることに気付くかもしれません。その結果、画像の一部が明るい白に見え、ディテールが失われます(上の小さな画像と重なっているコショウの一部に注意してください)。これを回避するには、画像を追加する前に画像の値をスケーリングするか、画像をタイプに変換しdoubleて操作を実行し、画像を再保存する前にスケーリングします。

于 2009-12-21T16:05:05.513 に答える
6

これは数学的には意味がありませんが、主張する場合は、次のようにすることができます。

cc = aa + [bb zeros(1,2)];
于 2009-12-21T12:06:04.543 に答える
4

私は10年間MATLABを使用していませんが、次のようなことをする必要があると思います。

cc = aa + [bb  zeros(1, length(aa) - length(bb))]
于 2009-12-21T12:07:08.963 に答える
1

aaがbbより大きいことが与えられた場合、私はこれを行います:

cc = aa;
cc(1:length(bb)) = cc(1:length(bb)) + bb;
于 2009-12-21T23:21:15.090 に答える