emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Insert calc vector directly into spreadsheet cells?
@ 2014-05-17 21:40 Steven Adrian
  2014-05-20 15:23 ` Bastien
  0 siblings, 1 reply; 7+ messages in thread
From: Steven Adrian @ 2014-05-17 21:40 UTC (permalink / raw)
  To: emacs-orgmode

I would like to insert a calc vector directly into a range of spreadsheet
cells from a function. As a specific example, consider the calc index
function, which returns a calc vector of integers from 1 to n. Once calc has
started within an emacs session, the index function can be accessed from
within the scratch buffer as:

(calcFunc-index 10)

If the above function is evaluated, the echo area will display the calc
vector returned by the function:

(vec 1 2 3 4 5 6 7 8 9 10)

I would like to put these values into a range of cells with a table formula
like:

#+TBLFM: @1$1..@1$10=index(10)

But the formula above just puts the whole vector in each cell. Can anyone
tell me how to put the vector values in individual cells?

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Insert calc vector directly into spreadsheet cells?
  2014-05-17 21:40 Insert calc vector directly into spreadsheet cells? Steven Adrian
@ 2014-05-20 15:23 ` Bastien
  2014-05-21  7:29   ` Michael Brand
  0 siblings, 1 reply; 7+ messages in thread
From: Bastien @ 2014-05-20 15:23 UTC (permalink / raw)
  To: Steven Adrian; +Cc: emacs-orgmode

Hi Steven,

Steven Adrian <sadrian@acumeniacal.com> writes:

> #+TBLFM: @1$1..@1$10=index(10)

Table formulas apply to individual fields, not to a range of fields.

> But the formula above just puts the whole vector in each cell. Can anyone
> tell me how to put the vector values in individual cells?

AFAIU you will need several TBLFM lines for this.

HTH,

-- 
 Bastien

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Insert calc vector directly into spreadsheet cells?
  2014-05-20 15:23 ` Bastien
@ 2014-05-21  7:29   ` Michael Brand
  2014-05-26 19:39     ` Steven Adrian
  0 siblings, 1 reply; 7+ messages in thread
From: Michael Brand @ 2014-05-21  7:29 UTC (permalink / raw)
  To: Org Mode; +Cc: Steven Adrian

Hi Steven

> Steven Adrian <sadrian@acumeniacal.com> writes:
>> #+TBLFM: @1$1..@1$10=index(10)
>>
>> But the formula above just puts the whole vector in each cell. Can anyone
>> tell me how to put the vector values in individual cells?

The vector elements can be accessed with Calc subscr() and Org "field
coordinates":
http://orgmode.org/manual/References.html

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
#+TBLFM: @1$1..@1$10 = subscr(index(10), $#)

In a TBLFM I would not use Calc vector functions like index() but a
calculation of $#, here simply f(x) = x:

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
#+TBLFM: @1$1..@1$10 = $#

Or is there an interesting Calc vector function that is not easy to
mimic?

Michael

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Insert calc vector directly into spreadsheet cells?
  2014-05-21  7:29   ` Michael Brand
@ 2014-05-26 19:39     ` Steven Adrian
  2014-05-26 20:43       ` Michael Brand
  0 siblings, 1 reply; 7+ messages in thread
From: Steven Adrian @ 2014-05-26 19:39 UTC (permalink / raw)
  To: Michael Brand; +Cc: Org Mode

Michael,

This is great. I wish I had seen this earlier. I did not know about the subscr function, but I had basically gotten to the same point by writing an equivalent custom calc function.

I understand that using a  calc function in a table formula is inefficient, since it is executed for every table cell.  But for small tables, I think the combination of table formulas and calc functions is extremely powerful. Here are two examples of mine:

1. I wrote a custom calc function called tailsInARow that uses the calc random function to simulate a coin toss and return the number of tails in a row. I used this function to fill a 20x20 table of values. I then used the calc histogram function in a table formula to read the table values, histogram the number of tails in a row, then write the histogram to a new table.

2. I calculated a rotation matrix as a succession of individual rotations about x, y, and z axes. I then wrote the resulting matrix to a table. I then wrote a table function to read the matrix, take the inverse, and write the result to a new table.

I think calc is well suited for small problems like this for which I want to have a record of what I did later. But I am always looking for better approaches, if you have any to suggest.

Steven

On May 21, 2014, at 3:29 AM, Michael Brand <michael.ch.brand@gmail.com> wrote:

> Hi Steven
> 
>> Steven Adrian <sadrian@acumeniacal.com> writes:
>>> #+TBLFM: @1$1..@1$10=index(10)
>>> 
>>> But the formula above just puts the whole vector in each cell. Can anyone
>>> tell me how to put the vector values in individual cells?
> 
> The vector elements can be accessed with Calc subscr() and Org "field
> coordinates":
> http://orgmode.org/manual/References.html
> 
> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
> #+TBLFM: @1$1..@1$10 = subscr(index(10), $#)
> 
> In a TBLFM I would not use Calc vector functions like index() but a
> calculation of $#, here simply f(x) = x:
> 
> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
> #+TBLFM: @1$1..@1$10 = $#
> 
> Or is there an interesting Calc vector function that is not easy to
> mimic?
> 
> Michael
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Insert calc vector directly into spreadsheet cells?
  2014-05-26 19:39     ` Steven Adrian
@ 2014-05-26 20:43       ` Michael Brand
  2014-05-27  9:12         ` Steven Adrian
  0 siblings, 1 reply; 7+ messages in thread
From: Michael Brand @ 2014-05-26 20:43 UTC (permalink / raw)
  To: Steven Adrian; +Cc: Org Mode

Hi Steven

On Mon, May 26, 2014 at 9:39 PM, Steven Adrian <sadrian@acumeniacal.com> wrote:
> This is great. I wish I had seen this earlier. I did not know about
> the subscr function, but I had basically gotten to the same point by
> writing an equivalent custom calc function.

With the Calc function defmath? How does it look like?

> 1. I wrote a custom calc function called tailsInARow that uses the
> calc random function to simulate a coin toss and return the number
> of tails in a row. I used this function to fill a 20x20 table of
> values. I then used the calc histogram function in a table formula
> to read the table values, histogram the number of tails in a row,
> then write the histogram to a new table.

Didn't know that Calc has a histogram function. The histogram values
would fit perfectly to the ASCII plot within an Org table:
http://orgmode.org/worg/org-contrib/orgtbl-ascii-plot.html

> 2. I calculated a rotation matrix as a succession of individual
> rotations about x, y, and z axes. I then wrote the resulting matrix
> to a table. I then wrote a table function to read the matrix, take
> the inverse, and write the result to a new table.

Interesting. How does the "function to read the matrix" look like?

Michael

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Insert calc vector directly into spreadsheet cells?
  2014-05-26 20:43       ` Michael Brand
@ 2014-05-27  9:12         ` Steven Adrian
  2014-05-27 18:06           ` Michael Brand
  0 siblings, 1 reply; 7+ messages in thread
From: Steven Adrian @ 2014-05-27  9:12 UTC (permalink / raw)
  To: Michael Brand; +Cc: Org Mode

Michael,

Here is the custom calc function that is similar to subscr. It will work for both vectors and matrices:

(defmath getElem (indices m)
  (let (i j)
    (if (vectorp indices)
      (progn
        (setq i (cadr indices))
        (setq j (nth 2 indices))
        (nth j (nth i m))
      )
      (progn
        (setq i indices)
        (nth i m)
      )
    )
  )
)

Here is the table function to get matrix data from a table, take the inverse, and write the result to a new table:

#+TBLFM: @1$1..@3$3=getElem([@#,$#],inv(arrange(remote(matrixTable,@1$2..@3$4),3))

Thanks for the tip about orgtbl-ascii-plot. I have been working on a set of notes about using calc and org mode that I am migrating over to read more like a tutorial, and I am now thinking about changing the histogram example to use orgtbl-ascii-plot instead of just writing the bin values in a table.

Steven


On May 26, 2014, at 4:43 PM, Michael Brand <michael.ch.brand@gmail.com> wrote:

> Hi Steven
> 
> On Mon, May 26, 2014 at 9:39 PM, Steven Adrian <sadrian@acumeniacal.com> wrote:
>> This is great. I wish I had seen this earlier. I did not know about
>> the subscr function, but I had basically gotten to the same point by
>> writing an equivalent custom calc function.
> 
> With the Calc function defmath? How does it look like?
> 
>> 1. I wrote a custom calc function called tailsInARow that uses the
>> calc random function to simulate a coin toss and return the number
>> of tails in a row. I used this function to fill a 20x20 table of
>> values. I then used the calc histogram function in a table formula
>> to read the table values, histogram the number of tails in a row,
>> then write the histogram to a new table.
> 
> Didn't know that Calc has a histogram function. The histogram values
> would fit perfectly to the ASCII plot within an Org table:
> http://orgmode.org/worg/org-contrib/orgtbl-ascii-plot.html
> 
>> 2. I calculated a rotation matrix as a succession of individual
>> rotations about x, y, and z axes. I then wrote the resulting matrix
>> to a table. I then wrote a table function to read the matrix, take
>> the inverse, and write the result to a new table.
> 
> Interesting. How does the "function to read the matrix" look like?
> 
> Michael
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Insert calc vector directly into spreadsheet cells?
  2014-05-27  9:12         ` Steven Adrian
@ 2014-05-27 18:06           ` Michael Brand
  0 siblings, 0 replies; 7+ messages in thread
From: Michael Brand @ 2014-05-27 18:06 UTC (permalink / raw)
  To: Steven Adrian; +Cc: Org Mode

Hi Steven

On Tue, May 27, 2014 at 11:12 AM, Steven Adrian <sadrian@acumeniacal.com> wrote:
> Here is the custom calc function that is similar to subscr. It will
> work for both vectors and matrices:
>
> (defmath getElem (indices m)
>   (let (i j)
>     (if (vectorp indices)
>       (progn
>         (setq i (cadr indices))
>         (setq j (nth 2 indices))
>         (nth j (nth i m))
>       )
>       (progn
>         (setq i indices)
>         (nth i m)
>       )
>     )
>   )
> )
>
> Here is the table function to get matrix data from a table, take the
> inverse, and write the result to a new table:
>
> #+TBLFM: @1$1..@3$3=getElem([@#,$#],inv(arrange(remote(matrixTable,@1$2..@3$4),3))

Very nice. I didn't know the Calc function arrange([a, b, c, d], 2) to
get [[a, b], [c, d]]. I always thought that when a TBLFM range spans
more than one row and column like in @1$2..@2$3 it should learn to
result in [[a, b], [c, d]] instead of the current [a, b, c, d]. Thanks
for showing how to deal with this.

Michael

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-05-27 18:06 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-17 21:40 Insert calc vector directly into spreadsheet cells? Steven Adrian
2014-05-20 15:23 ` Bastien
2014-05-21  7:29   ` Michael Brand
2014-05-26 19:39     ` Steven Adrian
2014-05-26 20:43       ` Michael Brand
2014-05-27  9:12         ` Steven Adrian
2014-05-27 18:06           ` Michael Brand

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).