2014 dxdy logo

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

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




 
 Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 21:34 
Здравтсвуйте,
Имеется массив ячеек X размером m на n. В каждой ячейке лежит либо ненулевой вектор либо она "пуста" (содержит [], что при необходиимости легко заменить на нулевой вектор). В каждой строке может быть произвольное количество "непустых" ячеек, некоторые строки могут содержать только "пустые" ячейки.
Необходимо получить массив ячеек Y размером k на 2, строки которого содержат все кортежи (двойки), составленные только из непустых элементов только одной и той же строки массива X.
Величину k понимаю как вычислить, то есть создать массив Y могу.
Но как его заполнить - не представляю.
Буду признателен любой помощи.

 
 
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 22:29 
Пожалуйста, опишите (желательно с примером) понятие «кортежи (двойки), составленные только из непустых элементов только одной и той же строки массива X

 
 
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 22:49 
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 
Путь для примера имеется массив ячеек с двумя строками и тремя столбцами.
В первой строке только один элемент не пустой. А во второй строке два непустых элемента. Тогда итоговый массив ячеек будет иметь одну строку.
Используется синтаксис 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 
GAA в сообщении #1391389 писал(а):
Путь для примера имеется массив ячеек с двумя строками и тремя столбцами.
В первой строке только один элемент не пустой. А во второй строке два непустых элемента. Тогда итоговый массив ячеек будет иметь одну строку. Я правильно понимаю?


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

 
 
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 23:28 
Тогда для каждой строки с двумя или более непустыми элементами получаем одномерный массив ячеек [содержащий ненулевые элементы строки], затем в двойном цикле перечисляем все сочетаний и добавляем по мере получения в массив ячеек Y. (Можно, конечно, и не создавать вспомогательный массив, а работать с исходным массивом ячеек.) Такой очевидный способ не подходит?

 
 
 
 Re: Обработка массива ячеек в Матлаб
Сообщение06.05.2019, 23:45 
GAA в сообщении #1391393 писал(а):
Тогда для каждой строки с двумя или более непустыми элементами получаем одномерный массив ячеек, затем в двойном цикле перечисляем все сочетаний и добавляем по мере получения в массив ячеек Y. (Можно конечно и не создавать вспомогательный массив, а работать с исходным массивом ячеек.) Такой очевидный способ не подходит?


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

 
 
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 00:28 
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 
GAA в сообщении #1391404 писал(а):
Т.к. говорится о сочетаниях элементов некоторой строки, то пусть для простоты матрица X имеет одну строку с 4 ненулевыми элементами.


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

 
 
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 01:02 
2. В цикле по строкам.

-- Tue 07.05.2019 00:16:11 --

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

 
 
 
 Re: Обработка массива ячеек в Матлаб
Сообщение07.05.2019, 01:58 
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 
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 
[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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group