Индексация матриц

Обсуждение форума и архива форума www.matlab.ru

Модератор: Admin

RacoonKald
Пользователь
Сообщения: 4
Зарегистрирован: Сб июн 10, 2017 6:45 pm

Индексация матриц

Сообщение RacoonKald » Сб июн 10, 2017 8:12 pm

Добрый день. Есть разреженная матрица H размером NxM. Я пробегаю по столбцам и если элемент в столбце равен единице, я запоминаю его позицию. Жестко задать я знаю как, но дело в том, что матрица H размером 2700x5400. Как можно задать индексы матрицам? То есть в последствии я хочу обращаться например EE(2,3), это будет означать что я обращаюсь к E2(3).

for i=1:N
if H(i,1)==1
E1=[E1 i];
end
end

for i=1:N
if H(i,2)==1
E2=[E2 i];
end
end


EE=[E1
E2];

Подскажите, пожалуйста, как можно задать цикл?

sandy
Эксперт
Сообщения: 5499
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Индексация матриц

Сообщение sandy » Сб июн 10, 2017 8:58 pm

Я не понял, что вы хотите сделать. Найти позиции всех единичных (или просто всех ненулевых?) элементов? Так это вам функция find сделает без всяких циклов.
С уважением

Александр Сергиенко

RacoonKald
Пользователь
Сообщения: 4
Зарегистрирован: Сб июн 10, 2017 6:45 pm

Re: Индексация матриц

Сообщение RacoonKald » Сб июн 10, 2017 9:40 pm

sandy писал(а):Я не понял, что вы хотите сделать. Найти позиции всех единичных (или просто всех ненулевых?) элементов? Так это вам функция find сделает без всяких циклов.


Мне необходимо задать два множества

M(l)={m: h(m,l)=1} - множество позиций ненулевых элементов в l-м столбце
и E(m)={l:h(m,l)=1} - множество позиций ненулевых элементов в m-й строке

То есть если есть матрица
H=[ 0 0 1 0 0
1 0 0 0 1
0 0 0 1 0 ]

то M(1)={2}, M(2)-пустое M(3)={1} M(4)={3} М(5)={2}
Е(1)={3} Е(2)={1, 5} E(3)={4}

я не понимаю как из того, что выводит find мне создать данные множества

sandy
Эксперт
Сообщения: 5499
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Индексация матриц

Сообщение sandy » Вс июн 11, 2017 1:51 am

Например так:

Код: Выделить всё

M = cell(1, size(H,2));
for k = 1:size(H,2)
M{k} = find(H(:,k));
end
E = cell(size(H,1), 1);
for k = 1:size(H,1)
E{k} = find(H(k,:));
end

В результате выполнения этого кода получаются массивы ячеек (cell array) M и E, в которых лежат нужные множества:

Код: Выделить всё

M
M =
    [2]    [0x1 double]    [1]    [3]    [2]
>> E
E =
    [         3]
    [1x2 double]
    [         4]
С уважением



Александр Сергиенко

RacoonKald
Пользователь
Сообщения: 4
Зарегистрирован: Сб июн 10, 2017 6:45 pm

Re: Индексация матриц

Сообщение RacoonKald » Вс июн 11, 2017 5:40 am

Спасибо! Я только начал программировать, не со всем разобрался.

RacoonKald
Пользователь
Сообщения: 4
Зарегистрирован: Сб июн 10, 2017 6:45 pm

Re: Индексация матриц

Сообщение RacoonKald » Вс июн 11, 2017 7:20 am

Подскажите, пожалуйста, а как теперь обращаться к конкретному элементу полученного массива? Например, к {5} в Е(2)={1, 5}?

sandy
Эксперт
Сообщения: 5499
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Индексация матриц

Сообщение sandy » Вс июн 11, 2017 10:57 am

Обратите внимание на то, что первая пара скобок - фигурные (номер ячейки), а вторая - круглые (номер элемента в массиве, являющемся содержанием ячейки).

Код: Выделить всё

E{2}(2)
ans =
     5
С уважением



Александр Сергиенко