2009-12-21 65 views
6

Tôi muốn thêm hai vectơ có độ dài khác nhau trong Matlab hoặc Octave. Ví dụ.Làm cách nào để thêm vectơ có độ dài khác?

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

nào nên kết quả trong một cc vector chứa

cc = [101 102 3 4] 

bất cứ ai có thể tìm ra cách để làm điều này?

Cập nhật: Đây là mã tôi đã kết thúc với các tín hiệu mà sau đó tôi chuyển đổi thành hình ảnh có thang màu xám.

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

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

plot(1:length(tc),tc) 

Cảm ơn bạn rất nhiều để tất cả các bạn =)

Trả lời

6

này không có ý nghĩa gì về mặt toán học, nhưng nếu bạn nhấn mạnh, bạn có thể làm điều này:

cc = aa + [bb zeros(1,2)]; 
+0

mát. Đó là bởi vì tôi có 2 ma trận, mà thực sự là những hình ảnh tỷ lệ xám tôi muốn thêm vào. Vì vậy, bây giờ tôi muốn khái quát hóa giải pháp của bạn cho ma trận =) – Louise

+2

-1: nó có ý nghĩa toán học trong một số trường hợp. –

+0

vâng, ví dụ, khi xử lý tín hiệu dưới dạng vec-tơ (có nghĩa là z-biến đổi) –

4

Tôi có không đã sử dụng MATLAB trong mười năm nhưng tôi nghĩ bạn sẽ phải làm điều gì đó như:

cc = aa + [bb zeros(1, length(aa) - length(bb))] 
+0

Nó cung cấp "Lỗi: Dấu ngoặc đơn không cân bằng hoặc dấu ngoặc đơn hoặc khung không mong muốn". Nhưng "cc = aa + [số không bb (1, chiều dài (bb))];" đang làm việc =) – Louise

+1

@Louise, tệ của tôi, nó phải có 'length' và không phải 'size'. Các công thức '0 (1, length (bb))' chỉ là trùng hợp ngẫu nhiên vì 'length (bb) = length (aa) - length (bb)'. –

+0

Tuyệt. Cảm ơn bạn đã thanh toán bù trừ. – Louise

9

Đối với trường hợp 1-D đối phó với một tập hợp các vectơ, các câu trả lời khác chỉ ra các giải pháp chính xác (liên quan đến việc đệm vectơ ngắn hơn với số không hoặc thực hiện phép cộng bằng cách sử dụng một con trỏ vào vector dài hơn). Tuy nhiên, vì bạn đã đề cập trong một nhận xét rằng cuối cùng bạn muốn thêm hai hình ảnh màu xám cùng nhau, tôi nghĩ tôi sẽ cho bạn thấy một giải pháp 2-D tổng quát hơn cho ma trận.

Trước tiên, tôi sẽ tải một số built-in hình ảnh mẫu MATLAB và nhận được kích thước của chúng:

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

Chú ý rằng tôi chuyển đổi hình ảnh RGB thành trắng đen đầu tiên sử dụng rgb2gray. Tiếp theo, tôi sẽ làm một ma trận mới của zero có kích thước là tối đa kích thước của hai hình ảnh:

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

Chú ý rằng tôi bao gồm 'uint8' trong cuộc gọi đến zeros, kể từ khi bạn muốn các ma trận của zero đến có cùng loại với hình ảnh của bạn để các hoạt động tiếp theo trên chúng hoạt động chính xác. Ma trận newImage hiện đủ lớn để chứa một trong hai hình ảnh. Cuối cùng, những hình ảnh có thể được thêm vào hình ảnh mới như vậy:

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

Và bạn có thể xem chúng như sau:

imagesc(newImage); 
colormap(gray); 

enter image description here

LƯU Ý: Một điều quan trọng cần xem xét là loại bạn sử dụng cho hình ảnh. Thông thường, dữ liệu hình ảnh được tải vào MATLAB là loại uint8. Tuy nhiên, bạn có thể nhận thấy rằng việc thêm hai số nguyên không dấu 8-bit như tôi đã làm ở trên có thể dẫn đến độ bão hòa nơi các pixel vượt quá giá trị 255 (giá trị lớn nhất cho số nguyên không dấu 8 bit). Kết quả là các phần của hình ảnh trông có màu trắng sáng và mất chi tiết (chú ý một số hạt ớt chồng lên hình ảnh nhỏ hơn ở trên). Bạn có thể muốn tránh điều này bằng cách mở rộng các giá trị trong hình ảnh của bạn trước khi thêm chúng hoặc bằng cách chuyển đổi hình ảnh của bạn thành loại double để thực hiện các thao tác và sau đó mở rộng chúng trước khi lưu lại hình ảnh.

+0

WOW! Cảm ơn bạn rất nhiều vì giải pháp rất chi tiết đó! Đó chính là điều tôi muốn làm. =) – Louise

1

Nếu nó là một định rằng aa lớn hơn bb, sau đó tôi sẽ làm điều này:

cc = aa; 
cc(1:length(bb)) = cc(1:length(bb)) + bb; 
Các vấn đề liên quan