Posted by
CARL Philippe (LBP) on
Oct 05, 2016; 12:07pm
URL: http://imagej.273.s1.nabble.com/Creating-n-arrays-in-a-loop-tp5017287p5017292.html
Dear Matt and Micheal,
In the case "you don't know in advance how many columns you have", can't you
just use the "Array.concat(array1,array2)" instruction like:
oldArray = Array.concat(oldArray, newlyExtendingArray);
or am I missing something?
My best regards,
Philippe
-----Message d'origine-----
De : ImageJ Interest Group [mailto:
[hidden email]] De la part de
Michael Schmid
Envoyé : mercredi 5 octobre 2016 13:48
À :
[hidden email]
Objet : Re: Creating "n" arrays in a loop
Hi Matt,
if you don't know in advance how many columns you have, you could use the
ResultsTable. There you can easily have something like
columnHeading = "ID_Raw_ch"+i;
setResult(columnHeading, row, value);
If you know the number of columns in advance, you could also use a String
with tab-delimited or comma-delimited columns, where you simply append the
result and a delimiter character, and a linefeed ("\n") when the file (line)
is done.
If the String will become long (> few thousands of entries), for performance
reasons, best use the String Buffer:
https://imagej.nih.gov/ij/developer/macro/functions.html#StringMichael
________________________________________________________________
On 2016-10-05 12:32, PEARSON Matthew wrote:
> Hi Herbie and Michael,
>
> Thanks for the feedback. Unfortunately i think i will have to elaborate
on what i'm trying to do to see if the way i'm doing it seems odd to
everyone else.
>
> I have a macro that can analyse n channels and the user is presented with
a dialog at the start to ask how many channels there are in the image stack
and in which order. From here each channel that they select for analysis is
measured and all the results go into arrays for each set measurement and if
i print out the arrays to the results table it looks like this:
>
> Image name Mean Min ID_Raw
> value value value value
> value value value value
> value value value value
> value value value value
>
> The first two rows say, represent the results for channel 1 and rows 3-4
are for channel 2 but we could have 3 or 4 channels. There will always be
the same number of results (rows) per channel. Ideally i'd like to present
the results for each channel in separate columns instead of consecutively in
rows. However this is where i hit trouble because i need to split the
parent arrays.length by the number of channels and produce new arrays for
each channel, so the data would look like this when printed:
> Image name_ch1 Mean_ch1 Min_ch1 ID_Raw_ch1 Image name_ch2 Mean_ch2
> Min_ch2 ID_Raw_ch2 value value value value value value value value
> value value value value value value value value
>
> It will be a batch macro so will analyse many images but each image will
have the same number of channels per instance of running it at least. But
you can see why i require the flexibility of defining different numbers of
arrays and array names that somehow link to the channel number depending on
how many channels are to be analysed.
>
> Is this all too much to ask? I could just tell the users that the results
will be consecutive in rows that would save me a massive headache but i
prefer the idea that the headings are per channel and its based on columns
left to right.
>
> Thanks again!
>
> Matt
>
>
> --
> Matt Pearson
> Microscopy Facility
> MRC Human Genetics Unit
> Institute of Genetics and Molecular Medicine (IGMM) University of
> Edinburgh Crewe Road
> EH4 2XU
>
>
>
>
> On 5 Oct 2016, at 10:48, Michael Schmid
<
[hidden email]<mailto:
[hidden email]>> wrote:
>
> Hi Matt,
>
> you can't have arrays of arrays or 2D arrays in the ImageJ macro language.
The way out is flattening it out, so you have a longer 1D array:
>
> arrayLength=5;
> a = newArray(channels*arrayLength);
> for (i=0; i<channels; i++)
> a[i*arrayLength + 2] = someValueForArrayElement2;
>
> In other words, array elements 0-4 correspond to the first channel (i=0),
5-9 to the next channel (i=1), etc.
>
> Michael
> ________________________________________________________________
> On 2016-10-05 11:14, PEARSON Matthew wrote:
> Hi all,
>
> I must be having a mental block but i can't think how to define a variable
number of arrays within a loop. I'm looking for a way for the loop to be
able to create a number of arrays based on a counter variable. So something
like:
>
> channels = could be any number;
> array length = 5; (this is always known) for (i=0; i<channels; i++) {
> newArray = Ch + i [array length] }
>
> I'd like the newly defined arrays to have the same name "Ch" plus an
incremental number which comes from "i" but i don't know how to declare the
array name to have a variable included. Is this possible in the macro
language? I did a google search and came across a thread where someone had
suggested importing the java utility "array list" but this looked like quite
a complicated solution.
--
ImageJ mailing list:
http://imagej.nih.gov/ij/list.html--
ImageJ mailing list:
http://imagej.nih.gov/ij/list.html