フィルターのクリア

Click on row in TextArea?

9 ビュー (過去 30 日間)
Kurt
Kurt 2023 年 1 月 4 日
コメント済み: Walter Roberson 2023 年 1 月 5 日
I have a GUI that contains a TextArea. I read in a file that is 20,000 x 16 and convert each row to a string, so the resulting table is 20,000 x 1. Then I read that new "fits_text" table into the TextArea and use a formatSpec string to display it in neat columns, using tabs.
fits.TextArea.Value = fits_text;
So far, so good. Is there a way to click on a row of the text and determine which row it was, so I can process the data at that row in my original table (which is 20000 x 16)? Or do I need to use a UITable instead? I'm not sure I can fit a 16-column UITable into this GUI window.
Bonus question: It takes me about 7 minutes to re-format all 20,000 rows for display, using a "for" loop. I am pre-allocating space for the table. There must be a faster way. I can do this in Python in just a few seconds (but it doesn't look nearly as nice).
for i = 1:height(box_data)
fits_text{i,1} = sprintf(formatSpec, string(box_data{i,:}));
end

採用された回答

Kurt
Kurt 2023 年 1 月 5 日
The "compose" approach reduced the formatting from about 7 minutess to 10 seconds. Thanks!
I solved the TextArea size issue by leaving the 16-column TexArea alone, and creating a separate UITable off to the side containing just the first column of the TextArea - in effect, a "spinbox" containing text, not numbers. I can scroll through it and pick the appropriate line by clicking.

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2023 年 1 月 4 日
編集済み: Walter Roberson 2023 年 1 月 4 日
Unfortunately, TextArea do not have any selection callbacks; https://www.mathworks.com/help/matlab/ref/matlab.ui.control.textarea-properties.html
For the performance issue: use https://www.mathworks.com/help/matlab/ref/table.convertvars.html to build a new table from converting the existing variables to string. Then if you
fmt = [repmat('%s ', 1, 15), '%s'];
fits_text = compose(string(fmt), Table_Of_Strings{:,:});
This should, in theory, be higher performance.
If you wanted more careful control over the conversion of items into string then
fits_text = compose("Detailed % formats", box_data{:,1}, box_data{:,2}, box_data{:,3} ... box_data{:,16})
an uglier command line to be sure, but it gives per-item control like %6.2f and %-10s
  2 件のコメント
Kurt
Kurt 2023 年 1 月 5 日
Thanks. I'll try that.
Back to the performance issue: Is there a method to apply a full-blown function to an entire column without looping? I run into this a lot. I've done the simple one-liner, inline functions on a whole column, but I need something more. For example, the code to convert azimuth to right ascension is about 50 lines long. Is this possible?
Walter Roberson
Walter Roberson 2023 年 1 月 5 日
arrayfun.... but it is just a hidden loop, and you are better off vectorizing the code, possibly using logical indexing.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeEnvironment and Settings についてさらに検索

製品


リリース

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by