2013-07-07 4 views
0

Мне нужна помощь в решении проблемы индексирования. Назначенная задача гласит: Две матрицы (x и y) дают координаты для формирования матрицы B из матрицы A. Произведите матрицу B, которая содержит значения A в данных координатах по x и y. Например:MATLAB: Матрица, содержащая значения другой матрицы по определенным индексам

x = [1 1 1; 2 2 1] 
y = [1 2 1; 3 2 4] 
%This would read as (1,1),(1,2),(1,1),(2,3),(2,2),(1,4) 
% Given matrix: 
A = [6 7 8 9; 10 11 12 13]; 
%This would give us this answer for B (using the coordinate scheme above): 
B=[6 7 6; 12 11 9]; 

Я предполагаю, что мне нужно использовать функцию find в сочетании с sub2ind функции, но я не уверен на 100%, как перевести это в рабочий код. Единственное, что я могу думать о том, чтобы сделать что-то вроде этого:

B=((x(1),(y(1)), (x(2),y(2))....... 

Но это будет работать только для определенной матрицы выше, а не случайным образом матрицу. Я попытался найти подобную проблему на сайте, но я не смог ее найти. Ваша помощь будет действительно оценена!

+0

Попробуйте использовать петлю. Иногда самый простой подход - лучший. –

+2

Вы правы, 'sub2ind' был бы полезен здесь, а также' reshape', если хотите. Вам не нужен цикл - это можно сделать на одной строке. Читайте об [линейном индексировании здесь] (http://www.mathworks.com/help/matlab/math/matrix-indexing.html#f1-85511), чтобы узнать, можете ли вы понять, что делать с выходом из 'ind2sub '. – horchler

+0

На это ответили во многих вопросах: _e.g_: [Выбор элементов из массива в MATLAB] (http://stackoverflow.com/questions/13023997/), [Изменение нескольких элементов (из известных координат) матрицы без a for loop] (http://stackoverflow.com/questions/12294232), [MATLAB sub2ind using vectors] (http://stackoverflow.com/questions/16530668) и многое другое ... –

ответ

1

Вы не можете сделать это для случайно сгенерированных матриц, потому что вы должны убедиться, что в матрице A есть строки и столбцы в соответствии с значениями x и y.

В этом случае, вы можете написать:

for i=1:length(x(:)) 
    B(i)=A(x(i),y(i)); 
end 
B=reshape(B,size(x)); 
+0

Я продолжаю получать сообщение об ошибке, когда я реализую ваш код: «Для РЕАГИРОВАНИЯ количество элементов не должно меняться». и «Ошибка в B = изменить (B, размер (x))». Вот что я ввел в скрипт, он не работает: x = [1 1 1; 2 2 1] y = [1 2 1; 3 2 4] A = [6 7 8 9; 10 11 12 13] для i = 1: длина (x (:)) B (i) = A (x (i), y (i)); конец B = изменить (B, размер (x)) –

+0

Я скопировал ваш код и получил B = [6 7 6; 12 11 9]. Я не знаю, в чем проблема ... что вы получаете за 'size (B)'? – Adiel

+0

Прошу прощения, я только что повторил после очистки 'clear, clc' командного окна, и это сработало! Я получил правильную матрицу. Спасибо за вашу помощь! : D –

Смежные вопросы