this post was submitted on 22 May 2024
28 points (96.7% liked)

Open Source

31256 readers
251 users here now

All about open source! Feel free to ask questions, and share news, and interesting stuff!

Useful Links

Rules

Related Communities

Community icon from opensource.org, but we are not affiliated with them.

founded 5 years ago
MODERATORS
 

Hello! In qalc I can do calculations using measuring units like this:

> 5 W * 3 s

  (5 watts) × (3 seconds) = 15 J

I'd like to be able to do something similar also in GNU Octave. I think the symbolic library could be a place to look at, but I found nothing "already done". Do any of you know of a way to achieve this functionality?

top 9 comments
sorted by: hot top controversial new old
[–] [email protected] 6 points 5 months ago* (last edited 5 months ago) (1 children)

The Octave miscellaneous package has embedded GNU units as a function which should be helpful.

[–] [email protected] 3 points 5 months ago (1 children)

It looks interesting, but more focused on conversions than actual operations it seems:

octave:37> a.value = 100
a =

  scalar structure containing the fields:

    value = 100
    unit = W

octave:38> a.unit = 'W'
a =

  scalar structure containing the fields:

    value = 100
    unit = W

octave:39> b.value = 3
b =

  scalar structure containing the fields:

    value = 3
    unit = s

octave:40> b.unit = 's'
b =

  scalar structure containing the fields:

    value = 3
    unit = s

octave:41> a*b
error: binary operator '*' not implemented for 'scalar struct' by 'scalar struct' operations
[–] [email protected] 4 points 5 months ago (2 children)

I think I've found a solution. Matlab has implemented symunits in the symbolic toolbox and I've found the original? on Github. Hopefully it is compatible to GNU Octave.

[–] [email protected] 4 points 5 months ago

This looks very VERY promising! I'll try to install it tomorrow and Post here the results! Thanks?

[–] [email protected] 2 points 5 months ago (1 children)

I downloaded it and tried to run it, but it gets stuck in a loop and I don't know how it could be fixed:

error: max_recursion_depth exceeded
error: called from
    baseUnitSystem
    <unknown>

it seems the problem is in the line

coreUnits = buildCoreUnits(u.baseUnitSystem);

in the file u.m, I think because u.baseUnitSystem tries to "call itself". I don't know what this should be supposed to do, and have no idea on how to possibly fix it :(

[–] [email protected] 2 points 5 months ago

It seems that the implementation of classdev in Octave is unfortunately not complete enough yet.😒

[–] [email protected] 1 points 5 months ago (1 children)

I don't think symbolic will solve your problem at all

[–] [email protected] 1 points 5 months ago (1 children)

With symbolic variables J, s and W, the Ws won't be converted to J automatically.

[–] [email protected] 2 points 5 months ago

automatically no, but perhaps there's a way to replace it. If there's a way to check if a variable is "divisible by another symbolic one" then it would be not so hard to implement this behavior