2016-01-23 2 views
4

в Matlab У меня есть несколько записей базы данных, хранящихся в матрице DataMatrix. Каждая строка матрицы является записью, и каждый столбец является значением свойства записи. Для того, чтобы программа легко понять, для каждого столбца DataMatrix я определила имя переменной, объясняющее, что свойство связано с колонкой, то есть:Обмен «многими» переменными между функциями в Matlab

ColApple = 1; 
ColOrange = 2; 
ColLemon = 3; 
... 

У меня есть около 50 столбцов к имени.

Моя проблема в том, что значения в DataMatrix используются в разных функциях, и я хотел бы всегда использовать имя столбца для работы с данными в DataMatrix. Так что я должен разделить между различными функциями значения ColApple, ColOrange, ColLemon, ...

До сих пор я думал, что два возможных подхода:

  1. Making столбцы называют глобальной
  2. Определим функцию возвращая значения для имени столбцов, то есть:

    [ColApple, ColOrange, ColLemon, ... ] = getColNames

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

У любого человека есть более надежный или удобный подход для решения этой проблемы? Я уверен, что я не первый, кто имел дело с этим, но я не смог найти решение.

ответ

7

Этих идеально подходит для container maps. Карта контейнера позволяет создавать словарь. Например

fruits = containers.Map({'Apple', 'Orange', 'Lemon'}, [1, 2, 3]) 

создаст словарь

'Apple' -> 1 
'Orange' -> 2 
'Lemon' -> 3 

вы можете найти нужный номер столбца с

>> fruits('Orange') 

ans = 

    2 
+0

И здесь я думал, что у меня есть хорошее решение;) Всегда кто-то со встроенным, который выполняет именно то, что запрашивается. Отличная работа! – Adriaan

+0

@hbaderts, это именно то, что я искал, спасибо – MeSS83

2

Не используйте глобальные переменные, так как они подвержены ошибкам. Создание 50 имен переменных также не является очень надежным (см.: dynamic variable naming).

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

ColumnNames = {'Col1', 'Col2', 'Col3', (...) , 'Col 50'} 

Это даст вам массив 1 x 50 клеток, содержащий ваши имена столбцов. Имена могут быть найдены просто путем ввода правильного номера столбца, то есть столбец 22 будет ColumnNames{1,22}. Теперь вы можете передать переменную ColumnNames другим функциям как только одну переменную. Чтобы получить соответствующее имя столбца, если вы не используете имена динамических переменных, но, например, ваш colApple, вы можете использовать strcmp

ColIdx = find(strcmp(ColumnNames,'colApple')); 

Таким образом strcmp проверки, которые клетка содержит строку 'colApple', и find возвращает порядковый номер запрашиваемой ячейки.

я прохожу много переменных в моем собственном коде, который я делаю в structure array, так что в состоянии хранить все виды различных данных и иметь разумное имя для каждой записи структуры:

result.data = [m x 9 double] 
result.grid.z = ~[5000 x 5500 double] 
result.filename = 'filename.asc' 
... 
+0

спасибо, но я не уверен, что я полностью понять ответ. Используя ваш пример 'ColumnNames {1,22}' возвращает 'Col 22', поэтому, учитывая номер столбца, я получаю имя столбца. Учитывая две функции 'function1' и' function2', и я передаю им переменную 'ColumnNames', я уверен, что, учитывая тот же номер столбца, я получаю одно и то же имя столбца. Но то, что я ищу, противоположное: при том же имени столбца я хотел бы иметь тот же номер столбца. Таким образом, команда 'DataMatrix (:, Col22) = something' будет работать в том же столбце как в' function1', так и 'function2' – MeSS83

+0

Возможно, вы думаете, что после прохождения' ColumnNames' я должен создать переменные, используя что-то вроде 'for ii = 1: length (ColumnNames) str = [ColumnNames {1, ii} '=' int2str (ii)]; eval (str); end' – MeSS83

+0

@ MeSS83 Я никогда не думаю, что использование 'eval' - хорошая идея, когда-либо. См. Связанный пост об использовании динамических имен переменных. 'eval' ломает все, что связано с MATLAB и не должно использоваться по моему мнению. Если вы не перемещаете столбцы в своих данных, тогда, если вы передадите свои данные из одной функции в другую, столбец 22 по-прежнему будет столбцом 22, поэтому я не вижу проблемы там. – Adriaan

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