Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 20.07.2017
Сообщений: 25
1

Поиск граничных значений в массиве и вывод группы значений по условию

29.08.2019, 20:44. Показов 2733. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Запутался при решении своей же задачи. Имеется два массива чисел: 1 и 2. В каждом по 100000 значений. Нужно найти все ячейки массива 1, в которых значения изменяются. Затем вывести номера этих ячеек в таблицу J. Предположим, у одной такой ячейки номер (индекс) x. Тогда на последнем этапе нужно вывести значения массива 2 с индексами ((x-n)x-1)), где n можно задать. И так для каждой ячейки, в которой изменяется значение массива 1. Например, в массиве 1 значения [3 3 3 5 5 4], а в массиве 2 значения [1 1 1 6 6 5]. Я хочу в результате иметь при n=2 таблицу, в которой в первой колонке по имени 5 будет [1 1], во второй колонке по имени 4 будет [6 6]. Отдельно таблица J с номерами ячеек, в которых значения массива 1 изменялись, то есть [4 6].
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2019, 20:44
Ответы с готовыми решениями:

Поиск и вывод значений по условию
Здравствуйте! Прошу помощи в решении следующей задачи: В наличии имеем данные 6 столбцов 675...

Поиск граничных значений случайной величины
Есть вариант задачи: На обрабатывающий участок цеха поступают детали в среднем через 50 минут....

Поиск и вывод нескольких значений по условию
Добрый день! Необходимо из листа "свод", в котором вся ДЗ скопировать в отдельный лист "свыше 1...

Поиск значений по условию
Здравствуйте, товарищи форумчане! Помогите решить задачу! Есть таблица с двумя строками:...

9
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
29.08.2019, 21:03 2
Цитата Сообщение от narrowbuilder Посмотреть сообщение
Нужно найти все ячейки массива 1, в которых значения изменяются
[3 3 3 5 5 4]
[0 0 0 4 0 6] -> [4 6]
Я правильно понимаю?

Добавлено через 4 минуты
Я уверен, команды diff() и find() справятся с этим
1
0 / 0 / 0
Регистрация: 20.07.2017
Сообщений: 25
29.08.2019, 21:24  [ТС] 3
Спасибо за быстрый ответ! Это вторая часть задачи, если можно так сказать. У меня загвоздка и с решением первой части - как искать в массиве ячейки, в которых значение изменяется? Пробовал вводить переменную с индексом на шаг вперед, брал частное, пытался ставить условие поиска: если частное не равно 1, выводить номер (индекс) ячейки. Но потерпел полную неудачу - плохо знаю.
0
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
29.08.2019, 22:00 4
анекдот?
0
0 / 0 / 0
Регистрация: 20.07.2017
Сообщений: 25
29.08.2019, 22:58  [ТС] 5
Извините, я вас не понял. Поясните, пожалуйста, другими словами. Что конкретно непонятно:
команда diff даст разность соседних ячеек, но это мне не подходит.
Еще раз приведу пример моей задачи:
в массиве 1 значения [3 3 3 5 5 4],
в массиве 2 значения [1 1 1 6 6 5].
Индексы значений будут соответственно [1 2 3 4 5 6]. То есть номера колонок, если рассматривать массивы как таблицы с одной строкой и шестью колонками. Предположим, что n - это количество ячеек, предыдущих изменяющей ячейке.
Особенность в том, что изменяющие значение ячейки я ищу в массиве 1, а выводить n значений хочу из массива 2 по индексам, полученным в результате поиска по массиву 1.
Тогда при n=2 я хочу в результате иметь получить таблицу, в которой в первой колонке (по имени 5) будут значения:
1
1
а во второй колонке (по имени 4) будут:
6
6
Отдельно я хочу выводить таблицу (назову ее для удобства таблица J) с номерами ячеек, в которых значения массива 1 изменялись, то есть [4 6]. Тут 4 и 6 - это не значения, а номера колонок.
Как в этой задаче мне поможет комбинация команд diff и find?
Как я вас понял, вы предлагаете командой diff находить разности соседних ячеек, а командой find искать получившиеся все ненулевые ячейки. Но я не понял, как затем вытащить индексы (номера колонок) этих ненулевых ячеек, а затем по ним (как по адресам) достать соответствующие значения из массива 2? И делать это для всех 100000 значений, чтобы в итоге получить большую таблицу с обозначенными условиями.

Добавлено через 12 минут
Может быть, другой пример поможет понять, чего же я хочу.
Даны два массива (в каждом одна строка и 13 столбцов):
[11 14 12 15 15 15 17 17 12 13 13 13 13] - массив 1;
[13.0934 18.0022 13.9978 19.0001 19.0001 19.0001 24.2321 24.2321 13.9978 14.0444 14.0444 14.0444 14.0444] - массив 2.
Требуется составить две таблицы.
Первую таблицу вида:

Первая колонка (по имени 14)
Nn
13.0934
Вторая колонка (по имени 12)
13.0934
18.0022
Третья колонка (по имени 15)
18.0022
13.0934
Четвертая колонка (по имени 17)
19.0001
19.0001
Пятая колонка (по имени 12)
24.2321
24.2321
Шестая колонка (по имени 13)
24.2321
13.9978

Вторую таблицу вида:
Первая колонка (по имени ИНДЕКСЫ ИЗМЕНЕНИЙ МАССИВА 1)
2
3
4
7
9
10

Добавлено через 5 минут
Как я вижу решение (могу быть сильно неправ и решение далеко не оптимальное, хочется лучше):
1) Поиск в массиве 1 ячеек, в которых значения массива 1 изменяются;
2) Запись индексов найденных ячеек в отдельную таблицу;
2) Поиск в массиве 2 значений ячеек по записанным индексам и извлечение этих значений в отдельную таблицу с указанием измененного значения в качестве имени соответствующей колонки.
0
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
29.08.2019, 23:11 6
Командой diff() можете найти изменение, а find() найдет индексы
Если индексы IX, а для каждого хотим (x-n : x-1)
Matlab M
1
2
3
4
5
6
7
8
n = 3;    % например
ix = [
    x1-3 x1-2 x1-1
    x2-3 x2-2 x2-1 
    x3-3 x3-2 x3-1
    ...
    xn-3 xn-2 xn-1];
A2(ix)    % данные из 2-ого массива
Добавлено через 6 минут
твоя моя понимать?
1
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
30.08.2019, 09:47 7
Посмотрите
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
clear all; clc; close all;
m1=[11 14 12 15 15 15 17 17 12 13 13 13 13];
m2=[13.0934 18.0022 13.9978 19.0001 19.0001 19.0001 24.2321 24.2321 13.9978 14.0444 14.0444 14.0444 14.0444]; 
m3=diff(m1);
im31=find(m3~=0);
im32=im31-1;
ik=find(im32<1);
im32(ik)=1;
T2=im31'+1;  % Таблица 2
T1(1,:)=m2(im32);
T1(2,:)=m2(im31); % Таблица 1
T1
T2
И внимательно посмотрите 1 столбец Т1, у Вас в условии не определено, что делать при выходе за границу массива m1
1
0 / 0 / 0
Регистрация: 20.07.2017
Сообщений: 25
30.08.2019, 11:03  [ТС] 8
Спасибо большое за помощь, nuHrBuH!

Я пробовал так:

A=xlsread('CQI_100k');
B=xlsread('SINR_100k');
C=diff(A);
D=find(C==0);
E=find(C~=0);
n=(4:85225);
F=[
D(1)-10 D(1)-9 D(1)-8 D(1)-7 D(1)-6 D(1)-5 D(1)-4 D(1)-3 D(1)-2 D(1)-1 D(1)
D(2)-10 D(2)-9 D(2)-8 D(2)-7 D(2)-6 D(2)-5 D(2)-4 D(2)-3 D(2)-2 D(2)-1 D(2)
D(3)-10 D(3)-9 D(3)-8 D(3)-7 D(3)-6 D(3)-5 D(3)-4 D(3)-3 D(3)-2 D(3)-1 D(3)
...
D(n)-10 D(n)-9 D(n)-8 D(n)-7 D(n)-6 D(n)-5 D(n)-4 D(n)-3 D(n)-2 D(n)-1 D(n)];
G=uint16(F);

Но как дальше заполнить F значениями из B - не знал.

SSC, Ваш код работает - и он проще! Спасибо, SSC. Относительно условия, что делать при выходе за границу массива m1: я хотел бы возвращать нули. Маленький вопрос - можно ли как-то вывести переменную (скажем, N), которая будет задавать количество предыдущих значений?
Например, чтобы выбирать, выводить в третьем столбце Т1 так (при N=2):

18.0022
13.0934

или так (при N=3):

13.0934
18.0022
13.0934
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
30.08.2019, 11:25 9
Лучший ответ Сообщение было отмечено narrowbuilder как решение

Решение

Вот вариант
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
clear all; clc; close all;
m1=[11 14 12 15 15 15 17 17 12 13 13 13 13];
m2=[13.0934 18.0022 13.9978 19.0001 19.0001 19.0001 24.2321 24.2321 13.9978 14.0444 14.0444 14.0444 14.0444]; 
N=3;
m3=diff(m1);
im31=find(m3~=0);
T2=im31'+1;  % Таблица 2
 
T1(N,:)=m2(im31); % Таблица 1
for i=N-1:-1:1
    im31=im31-1;
    ik=find(im31<1);
    im31(ik)=1;
    T1(i,:)=m2(im31); % Таблица 1
    T1(i,ik)=0;
end
T1
T2
1
0 / 0 / 0
Регистрация: 20.07.2017
Сообщений: 25
30.08.2019, 17:40  [ТС] 10
SSC, большое спасибо, все работает!

Добавлено через 5 часов 34 минуты
Еще один вопрос - пытаюсь преобразовать входные данные из таблицы с 2 строками и 5 столбцами (назовем ее массивом X):
1 2 3 4 5
6 7 8 9 1

к виду 2 строки 1 столбец:
[1,2,3,4,5]
[6,7,8,9,1]

Использую num2cell:
X = xlsread('test.xlsx');
Y = num2cell(X,1)

Но эта команда возвращает таблицу вида:
2х1 double 2х1 double 2х1 double 2х1 double 2х1 double

В каждой ячейке которой столбцы. Например, в первой ячейке:
1
6

Добавлено через 20 минут
Разобрался сам.
K = xlsread('123.xlsx');
T = table(K);
U = table2cell(T)
0
30.08.2019, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2019, 17:40
Помогаю со студенческими работами здесь

Проверка граничных значений
Ребята, подскажите такую штуку. К примеру, объявляю переменную типа unsigned int value, для которой...

Поиск определенных значений по условию в DataGridView
Уважаемые форумчане,прошу вашей помощи. Есть 5 марок автомоб*илей, у каждой марки свой приоритет:...

Перенос значений по условию, очистка значений по условию
Необходимо 2 макроса Макрос 1 - перенос. Копировать только значения из строки 14 в строку 2...

Вывести множество значений функции, удовлетворяющих условию, и подсчитать количество остальных значений
Дана целочисленная функция f(k)= K^3-25K^2+50K+1000 определена только для целых значений аргумента...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru