Я использую M 8.0.4.
Я использую TableView в демо-манипуляции [] для отображения данных окончательного решения, представляющих собой матрицу числовых данных.
TableView очень удобен в использовании, поскольку он поставляется с автоматическими полосами прокрутки для перемещения вниз по строкам и вправо по столбцам, чтобы можно было видеть всю матрицу, сохраняя при этом общую область отображения фиксированной. (У меня есть изображение внизу)
Проблема, для которой я не могу найти решение, заключается в том, что мне нужно отформатировать матричные данные, чтобы они выглядели хорошо. В противном случае, если элемент данных слишком велик для размещения в ячейке, он будет перенесен, что приведет к смещению TableView. Мне также нужно отрегулировать десятичную точку в таком другом формате.
Я не могу применить NumberForm или AccountForm к данным, а затем применить TableView к результату, потому что TableView не любит видеть эти оболочки, ему нужны числа.
Но если применить AccountingForm к TableView, то числа, представляющие номера строк и номера столбцов, которые автоматически добавляются TableView, также форматируются. И я не хочу, чтобы те отформатировали также. Номер строки должен оставаться целым числом, а не с плавающей точкой. Я просто хочу, чтобы данные были отформатированы.
Я не мог понять, как отформатировать данные из таблицы. Когда я использую FullForm, чтобы увидеть, как данные хранятся в TableView, я не мог понять, как отформатировать их, не нарушая TableView.
Я покажу проблему, затем покажу, что я пытался.
(* make up some data, and make a TableView of it *)
data = {{-1234.8, 0.123}, {0.12345678, 0.1234}}
tbl = TableView[data, ItemSize -> {{3, {8}}}, DefaultBaseStyle -> 11,
Spacings -> {.2, .1}, FrameStyle -> Gray]

Обратите внимание, что номера строк и столбцов (отмечены) являются положительными целыми числами.
Теперь я хотел отформатировать сами данные (точные параметры форматирования, используемые ниже, являются только примером)
AccountingForm[tbl, {6, 3}, NumberSigns -> {"-", "+"},
NumberPadding -> {"", ""}, SignPadding -> True]
Но теперь строки и столбцы таблицы также отформатированы:

Полная форма TableView:
In[156]:= FullForm[tbl]
TableView[List[List[-1234.8`,0.123`],List[0.12345678`,0.1234`]],
Rule[ItemSize,List[List[3,List[8]]]],
Rule[DefaultBaseStyle,11],Rule[Spacings,List[0.2`,0.1`]],
Rule[FrameStyle,GrayLevel[0.5`]]]
Таким образом, данные в TableView можно извлечь, используя
In[166]:= tbl[[1]]
Out[166]= {{-1234.8,0.123},{0.12345678,0.1234}}
Но когда я изменяю tbl[[1]]
, используя ReplacePart[]
, с AccountingForm
версией данных, TableView
больше не работает:
formattedData =
AccountingForm[data, {6, 3}, NumberSigns -> {"-", "+"},
NumberPadding -> {"", "0"}, SignPadding -> True];
In[245]:= tbl=ReplacePart[tbl,1->formatted]
Out[245]= TableView[{{-1234.8,+0.123},{+0.123,+0.123}},
ItemSize->{{3,{8}}},DefaultBaseStyle->11,Spacings->{0.2,0.1},
FrameStyle->GrayLevel[0.5]]
Итак, я сломал TableView. Так как он больше не отображается.
Вопрос: Как отформатировать числовые данные, которые входят в TableView, не влияя на значения индекса строки / столбца?
Кстати, вот так выглядит TableView внутри одной демонстрации Manipulate, которую я имею. Обратите внимание на автоматические полосы прокрутки. (В этом я не использую NumberForm
и его друзей для форматирования. Но то, что я сделал, не очень эффективно, я бы предпочел использовать NumberForm
, если смогу, поэтому мой вопрос)

спасибо
обновление 22.12.11 1:30 AM
Вот полный пример кода для Майка, который следит за своим ответом ниже
data = {{-1234.8, 0.123}, {0.12345678, 0.1234}};
newData =
Map[AccountingForm[#, {6, 3}, NumberSigns -> {"-", "+"},
NumberPadding -> {"", ""}, SignPadding -> True] &, data, {2}];
tbl = TableView[newData, ItemSize -> {{3, {8}}}, Spacings -> {.2, .1},
FrameStyle -> Gray]
Теперь, как именно я могу использовать команду Cell для вышеперечисленного? (Это в Manipulate, а не в сеансе записной книжки. Manipulate запускает все в одной ячейке. Я не могу создать отдельные ячейки и тому подобное в этом коде. Но попробовать это можно в новой записной книжке, но на самом деле код, который будет использовать это решение должно работать в манипуляторе без ячеек.
Обновление 12/22/11 5 утра
Я заметил некоторые не очень хорошие показатели TableView. Считайте этот код
Remove["Global`*"];
ClearSystemCache[]
m1 = MemoryInUse[$FrontEnd];
N[m1/10^6]
n = 256;
data = Table[RandomReal[], {n}, {n}];
TableView[data, ContentSize -> {300, 300}]
m2 = MemoryInUse[$FrontEnd] - m1;
N[m2/10^6]
Сами данные, считая удвоение для действительных значений, составляют только половину МБ. ByteCount говорит
2 МБ из-за другой структуры бухгалтерских данных.
In[114]:= ByteCount[data]/10^6//N
Out[114]= 2.10948
Но внешний интерфейс, похоже, использует гораздо больше оперативной памяти (для всего TableView я имею в виду не только данные), иногда я получаю 20 МБ, а иногда и намного больше (получая 100 МБ за один раз). Но если вы попробуете описанное выше на своем компьютере, вы заметите, что М испытывает трудности с этим. Я думаю, что это может быть отрисовка части таблицы, из-за которой M занимает так много времени.
Я не думаю, что 256 на 256 - это такая большая матрица. Даже при 128 на 128 было трудно представить его на экране. Как только он работает, он работает быстро и без проблем.
Похоже, TableView еще не очень хорошо оптимизирован. Я думаю, что я буду использовать его только для отображения небольшой части матрицы решения, так как производительность не очень хороша, чтобы использовать ее в демонстрации для отображения всего решения, из-за этого демонстрация будет выглядеть плохо.
Проблема в том, что матрица моего решения может быть большой, и я хотел, чтобы данные отображались в ограниченном объеме графического интерфейса. TableView - это все, что я могу найти со встроенной панелью прокрутки. Ничто другое в элементах управления Manipulate не может использовать что-то подобное, поэтому я должен использовать TableView.
Обновление 22.12.11 16:00
Спасибо за подсказку Майка ниже, теперь я смотрю на использование Pane с Scollbars, и оно работает лучше, чем TableView. (все еще немного медленный с большими данными, но не так плохо, как TableView)
Вот пример кода:
n = 32;
data = Table[RandomReal[], {n}, {n}];
grid = Grid[data, Spacings -> {.4, .4}, Alignment -> Left, Frame -> All];
grid = Style[NumberForm[grid, {6, 5}], LineBreakWithin -> False];
pane = Pane[grid, ImageSize -> {200}, Scrollbars -> True]

Единственная проблема, которую я заметил до сих пор, заключается в том, что когда n становится большим, Pane генерирует этот внешний кадр, говоря, что генерируется очень большой вывод. Но я уверен, что есть программный способ (вариант где-то) отключить этот эффект, я только начал смотреть на это и должен быть в состоянии найти способ обойти это, как только я выпью кофе. (скрестив пальцы)

хорошие новости
«Очень большой вывод был сгенерирован», ТОЛЬКО отображается в интерфейсе ноутбука. Когда я поместил код в Manipulate и запустил его, он не показал этот выходной кадр. Итак, я счастлив сейчас, и этот вопрос закрыт. Теперь я буду использовать Pane. (Еще раз спасибо Майку)
Кстати, чтобы удалить рассматриваемое сообщение, вот полезная ссылка, которую я нашел:
http://forums.wolfram.com/mathgroup/archive/2009/Apr/msg00935.html
но мне не нужно было ничего делать для того, что я делаю.