2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 21:34 


26/09/17
294
Здравтсвуйте,
Имеется массив ячеек X размером m на n. В каждой ячейке лежит либо ненулевой вектор либо она "пуста" (содержит [], что при необходиимости легко заменить на нулевой вектор). В каждой строке может быть произвольное количество "непустых" ячеек, некоторые строки могут содержать только "пустые" ячейки.
Необходимо получить массив ячеек Y размером k на 2, строки которого содержат все кортежи (двойки), составленные только из непустых элементов только одной и той же строки массива X.
Величину k понимаю как вычислить, то есть создать массив Y могу.
Но как его заполнить - не представляю.
Буду признателен любой помощи.

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 22:29 
Заслуженный участник


12/07/07
4134
Донецк, Украина
Пожалуйста, опишите (желательно с примером) понятие «кортежи (двойки), составленные только из непустых элементов только одной и той же строки массива X

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 22:49 


26/09/17
294
GAA в сообщении #1391384 писал(а):
Пожалуйста, опишите (желательно с примером) понятие «кортежи (двойки), составленные только из непустых элементов только одной и той же строки массива X


Кортеж (двойка) - 2 элемента, все кортежи (двойки) - все сочетания по 2 элемента из k элементов.

Пример всех кортежей, составленных только из непустых элементов только одной и той же строки массива:
Исходный массив X:
$$\begin{bmatrix}
0&a&0&b&0&0&0\\
0&c&0&0&0&d&e\\
0&0&f&0&0&0&0\\
0&0&0&0&0&0&0\end{bmatrix}$$
Требуемый массив Y:
$$\begin{bmatrix}
a&b\\
c&d\\
c&e\\
d&e\\
 \end{bmatrix}$$

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 23:08 
Заслуженный участник


12/07/07
4134
Донецк, Украина
Путь для примера имеется массив ячеек с двумя строками и тремя столбцами.
В первой строке только один элемент не пустой. А во второй строке два непустых элемента. Тогда итоговый массив ячеек будет иметь одну строку.
Используется синтаксис Matlab M
X = cell(2, 3);
X{2,3} = [2, 3];
X{2,1} = [2, 1];
X{1,1} = [1, 1];
Y = cell(1, 2);
Y{1, 1} = X{2,1}; Y{1, 2} = X{2,3}
Y =
    [1x2 double]    [1x2 double]
 
Я правильно понимаю?

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 23:14 


26/09/17
294
GAA в сообщении #1391389 писал(а):
Путь для примера имеется массив ячеек с двумя строками и тремя столбцами.
В первой строке только один элемент не пустой. А во второй строке два непустых элемента. Тогда итоговый массив ячеек будет иметь одну строку. Я правильно понимаю?


Да. Вообще говоря строки, которые содержат только один непустой элемент я уже "зачистил" - превратил их в полностью "пустые".

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 23:28 
Заслуженный участник


12/07/07
4134
Донецк, Украина
Тогда для каждой строки с двумя или более непустыми элементами получаем одномерный массив ячеек [содержащий ненулевые элементы строки], затем в двойном цикле перечисляем все сочетаний и добавляем по мере получения в массив ячеек Y. (Можно, конечно, и не создавать вспомогательный массив, а работать с исходным массивом ячеек.) Такой очевидный способ не подходит?

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 23:45 


26/09/17
294
GAA в сообщении #1391393 писал(а):
Тогда для каждой строки с двумя или более непустыми элементами получаем одномерный массив ячеек, затем в двойном цикле перечисляем все сочетаний и добавляем по мере получения в массив ячеек Y. (Можно конечно и не создавать вспомогательный массив, а работать с исходным массивом ячеек.) Такой очевидный способ не подходит?


1. "Для каждой строки с двумя или более непустыми элементами получаем одномерный массив ячеек". Строка массива X и так есть одномерный массив ячеек, не вполне понимаю зачем создавать множество массивов.
2. "В двойном цикле перечисляем все сочетания" - не вполне понимаю. Есть функция Матлаба nchoosek, с помощью которой можно получить любые сочетания, в том числе по 2 элемента, из указанного массива. Но в том то и дело, что нужны все паросочетания только из множества непустых элементов строки. Если Вы это и имели ввиду - покажите, плиз, код "двойного цикла", который Вы имели ввиду.
3. Что понимается под "вспомогательным" массивом я тоже не понял. Массив Y не вспомогательный, а требуемый.

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 00:28 
Заслуженный участник


12/07/07
4134
Донецк, Украина
1. Для простоты, но не обязательно. Можно и без него (уже писал выше).
2. См ниже.
3. Z — вспомогательный массив ячеек, см. исходник ниже.

Т.к. говорится о сочетаниях элементов некоторой строки, то пусть для простоты матрица X имеет одну строку с 4 ненулевыми непустыми элементами.
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
n = 5
X = cell(1, n);
X{1,5} = [1, 5];
X{1,4} = [1, 4];
X{1,3} = [1, 3];
X{1,1} = [1, 1];
Y = cell(3, 2);
Z = []
k = 0
for i =1:n
  if ~isempty(X{1, i})
    k = k+1  
    Z{k} = X{1, i};
  end
end
o = 0;
for i=1:k-1
  for j = i+1:k
    o= o+1;  
    Y{o, 1}= Z{i}; Y{o, 2} = Z{j};
  end    
end    
for i = 1:o
  [num2str(Y{i,1}), ' | ', num2str(Y{i,2})]  
end



ans = 1  1 | 1  3
ans = 1  1 | 1  4
ans = 1  1 | 1  5
ans = 1  3 | 1  4
ans = 1  3 | 1  5
ans = 1  4 | 1  5

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 00:55 


26/09/17
294
GAA в сообщении #1391404 писал(а):
Т.к. говорится о сочетаниях элементов некоторой строки, то пусть для простоты матрица X имеет одну строку с 4 ненулевыми элементами.


1. В Вашем примере исходная матрица не содержит нулевых элементов, которые и являются основной трудностью. Если нулевых элементов в строке массива нет, то и вопроса у меня нет.
2. Не понимаю, как использовать предложенный код для обработки массива X, который приведен мною Выше в качестве примера (3 строку с ненулевым элементом f можно считать полностью нулевой).

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 01:02 
Заслуженный участник


12/07/07
4134
Донецк, Украина
2. В цикле по строкам.

-- Tue 07.05.2019 00:16:11 --

1.
maximkarimov в сообщении #1391380 писал(а):
В каждой ячейке лежит либо ненулевой вектор либо она "пуста" (содержит [],
Вот X(1, 2) пустой.
Если нужно другое, то сформулируйте точно условие.

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 01:58 


26/09/17
294
GAA в сообщении #1391412 писал(а):
2. В цикле по строкам.

-- Tue 07.05.2019 00:16:11 --

1.
maximkarimov в сообщении #1391380 писал(а):
В каждой ячейке лежит либо ненулевой вектор либо она "пуста" (содержит [],
Вот X(1, 2) пустой.
Если нужно другое, то сформулируйте точно условие.

Не заметил что вторую ячейку Вы оставили "пустой", прошу прощения!
Запустил Ваш код - получил шесть строк. Это обнадеживает!)
1. Поясните, плиз, откуда появился размер
Используется синтаксис Matlab M
Y = cell(3, 2)
и что он означает?
2. Обрабатывая одну, единственную строку, я, в принципе, почти понимаю как засунуть ответы в один массив (в Вашем примере он будет 6 на 2). Но как запуская код в цикле для каждой строки получить один, общий массив - не догадываюсь(((

Не могли бы Вы доработать Ваш код для обработки исходного массива Х , в котором имеется несколько строк с получением в результате одного, требуемого массива Y?
Спасибо!

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 13:03 
Заслуженный участник


12/07/07
4134
Донецк, Украина
1. С циклами — это не в стиле matlab. Просто задача не была сформулирована, поэтому предложил самый очевидный вариант. Y = cell(3, 2) — это просто от более «короткой» матрицы-строки осталось. (Просто для отладки. Меньше 3 сочетаний я не предположил, что будет.)

2. Вот исходный текст m-функции. Не проверял на работоспособность. Просто для пояснения «идеи цикла по строкам».
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
function [R, count] = CCofList(X)

  [m, n] = size(X);
  o = 0;         % o - номер последнего найденного сочетания
  for q=1:m      % цикл по строкам матрицы ячеек
    k = 0;       % количество непустых элементов текущей строки X
    Z = [];      % Z - массив ячеек непустых элементов текущей строки матрицы X
    for i =1:n   % получение массива Z и k для текущей строки
      if ~isempty(X{q, i})
        k = k+1;  
        Z{k} = X{q, i};
      end
    end          
    for i=1:k-1
      for j = i+1:k
       o= o+1;  
       R{o, 1}= Z{i}; R{o, 2} = Z{j};
      end    
    end
  end % Конец внешнего цикла (по строкам)
  if nargout == 2
    count = o;  
   end
end
Пример с одной строкой (повтор примера из предыдущего сообщения)
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
n=6;
X = cell(1, n);
X{1,6} = [1, 6];
X{1,5} = [1, 5];
X{1,4} = [1, 4];
X{1,3} = [1, 3];
X{1,1} = [1, 1];
[Y, k] = CCofList(X);
disp('List of C')
for i = 1:k
  disp(['Y(', num2str(i, '%02i'), ')= ', num2str(Y{i,1}), ' | ', num2str(Y{i,2})])  
end
>> List of C
Y(01)= 1  1 | 1  3
Y(02)= 1  1 | 1  4
Y(03)= 1  1 | 1  5
Y(04)= 1  1 | 1  6
Y(05)= 1  3 | 1  4
Y(06)= 1  3 | 1  5
Y(07)= 1  3 | 1  6
Y(08)= 1  4 | 1  5
Y(09)= 1  4 | 1  6
Y(10)= 1  5 | 1  6
Запуск на примере матрицы из сообщения post1391385.html#p1391385
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
n=7; m = 4;
X = cell(m, n);
X{1,2} = 'a';
X{1,4} = 'b';
X{2,2} = 'c';
X{2,6} = 'd';
X{2,7} = 'e';
X{3,3} = 'f';
Y = CCofList(X)

>>
Y =

    'a'    'b'
    'c'    'd'
    'c'    'e'
    'd'    'e'

Дорабатывать не буду т.к. задача не сформулирована.

 Профиль  
                  
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 13:24 


26/09/17
294
[quote="GAA в [url=http://dxdy.ru/post1391472.html#p1391472]
Дорабатывать не буду т.к. задача не сформулирована./quote]

Огромное спасибо за помощь!
Вот код, который получился у меня и решает строго, на мой взгляд, сформулированную задачу:
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
Y={};
Yi=1;
m=size(X,1);
n=size(X,2);
for i=1:m
    for j=1:n
        for p=j+1:n
           if ~isempty(X{i,j})
               if ~isempty(X{i,p})
                     Y{Yi,1} = X{i,j};
                     Y{Yi,2} = X{i,p};
                     Yi=Yi+1;
               end
           end
        end
    end
end
 

Задаем массив X -получаем массив Y.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group